I have defined all the dangerous permissions in a String array as below:
String[] perms = {Manifest.permission.READ_CONTACTS, Manifest.permission.READ_PHONE_STATE, Manifest.permission.CALL_PHONE, Manifest.permission.MODIFY_PHONE_STATE};
Then to check if they have been granted I run this:
for (int i = 0; i < perms.length; i++) { if(ContextCompat.checkSelfPermission(this,perms[i])!=PackageManager.PERMISSION_GRANTED) { ActivityCompat.requestPermissions(this,perms, permsRequestCode); break; } }
For some reason this does not work. It asks for permission once, and then if I manually disable it from settings, it brings up the dialog box more than once.
How do I fix this?
checkSelfPermission(activity, Manifest. permission. X) checks if any permission is already granted, if you check out other answers they do the same, and rest of the code asks for the permissions not granted.
checkSelfPermission(String perm); It returns an integer value of PERMISSION_GRANTED or PERMISSION_DENIED. Note: If a user declines a permission that is critical in the app, then shouldShowRequestPermissionRationale(String permission); is used to describe the user the need for the permission.
The ContextCompat. CheckSelfPermission method (available with the Android Support Library) is used to check if a specific permission has been granted. This method will return a Android.
The method shouldShowRequestPermissionRationale() can be used to check whether the user selected the 'never asked again' option and denied the permission.
As far as I know, this should be working. But you can try using the following function that works. It has a different method than yours.
String requiredPermission = android.Manifest.permission.READ_CONTACTS; int checkVal = getContext().checkCallingOrSelfPermission(requiredPermission);
Now you can check:
if (checkVal==PackageManager.PERMISSION_GRANTED){}
Use this to check any permissions you want, either single or multiple permissions at once.
public class PermissionsUtils { public static final int REQUEST_PERMISSION_MULTIPLE = 0; public static final int REQUEST_PERMISSION_CAMERA = 1; public static final int REQUEST_PERMISSION_LOCATION = 2; public static final int REQUEST_WRITE_EXTERNAL = 3; public static boolean checkAndRequestPermissions(Activity activity) { System.out.println("PermissionsUtils checkAndRequestPermissions()"); int permissionCamera = ContextCompat.checkSelfPermission(activity, Manifest.permission.CAMERA); int permissionLocation = ContextCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_FINE_LOCATION); int permissionWriteExternal = ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE); // Permission List List<String> listPermissionsNeeded = new ArrayList<>(); // Camera Permission if (permissionCamera != PackageManager.PERMISSION_GRANTED) { // Should we show an explanation? if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.CAMERA)) { Toast.makeText(activity, "Camera Permission is required for this app to run", Toast.LENGTH_SHORT) .show(); } listPermissionsNeeded.add(Manifest.permission.CAMERA); } // Read/Write Permission if (permissionWriteExternal != PackageManager.PERMISSION_GRANTED) { listPermissionsNeeded.add(Manifest.permission.WRITE_EXTERNAL_STORAGE); } // Location Permission if (permissionLocation != PackageManager.PERMISSION_GRANTED) { listPermissionsNeeded.add(Manifest.permission.ACCESS_FINE_LOCATION); } if (!listPermissionsNeeded.isEmpty()) { ActivityCompat.requestPermissions(activity, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]), REQUEST_PERMISSION_MULTIPLE); return false; } return true; } /** * Requests the Camera permission. If the permission has been denied * previously, a SnackBar will prompt the user to grant the permission, * otherwise it is requested directly. */ public static void requestCameraPermission(Activity activity) { // Here, thisActivity is the current activity // System.out.println("requestCameraPermission() INITIAL"); // Toast.makeText(this, "requestCameraPermission() INITIAL", // Toast.LENGTH_LONG).show(); if (ContextCompat.checkSelfPermission(activity, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) { // Should we show an explanation? if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.CAMERA)) { // Toast.makeText(activity, "Camera permission is // needed for this app to run ", // Toast.LENGTH_SHORT).show(); // System.out.println("requestCameraPermission() SHOW INFO"); // Show an explanation to the user *asynchronously* -- don't // block // this thread waiting for the user's response! After the user // sees the explanation, try again to request the permission. ActivityCompat.requestPermissions(activity, new String[] { Manifest.permission.CAMERA }, REQUEST_PERMISSION_CAMERA); } else { // No explanation needed, we can request the permission. // System.out.println("requestCameraPermission() ASK // PERMISSION"); ActivityCompat.requestPermissions(activity, new String[] { Manifest.permission.CAMERA }, REQUEST_PERMISSION_CAMERA); } // Permission is granted } else { System.out.println("requestCameraPermission() PERMISSION ALREADY GRANTED"); } } public static void requestLocationPermission(Activity activity) { if (ContextCompat.checkSelfPermission(activity, Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // Should we show an explanation? if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.ACCESS_FINE_LOCATION)) { Toast.makeText(activity, "LOCATION permission is needed to display location info ", Toast.LENGTH_SHORT) .show(); // Show an explanation to the user *asynchronously* -- don't // block this thread waiting for the user's response! After the // user sees the explanation, try again to request the // permission. ActivityCompat.requestPermissions(activity, new String[] { Manifest.permission.ACCESS_FINE_LOCATION }, REQUEST_PERMISSION_LOCATION); Toast.makeText(activity, "REQUEST LOCATION PERMISSION", Toast.LENGTH_LONG).show(); } else { // No explanation needed, we can request the permission. ActivityCompat.requestPermissions(activity, new String[] { Manifest.permission.ACCESS_FINE_LOCATION }, REQUEST_PERMISSION_LOCATION); Toast.makeText(activity, "REQUEST LOCATION PERMISSION", Toast.LENGTH_LONG).show(); // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an // app-defined int constant. The callback method gets the // result of the request. } // Permission is granted } else { } } public static void requestWriteExternalPermission(Activity activity) { if (ContextCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { // Should we show an explanation? if (ActivityCompat.shouldShowRequestPermissionRationale(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE)) { Toast.makeText(activity, "Write permission is needed to create Excel file ", Toast.LENGTH_SHORT).show(); // Show an explanation to the user *asynchronously* -- don't // block this thread waiting for the user's response! After the // user sees the explanation, try again to request the // permission. ActivityCompat.requestPermissions(activity, new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, REQUEST_WRITE_EXTERNAL); Toast.makeText(activity, "REQUEST LOCATION PERMISSION", Toast.LENGTH_LONG).show(); } else { // No explanation needed, we can request the permission. ActivityCompat.requestPermissions(activity, new String[] { Manifest.permission.WRITE_EXTERNAL_STORAGE }, REQUEST_WRITE_EXTERNAL); } } } public static boolean hasPermissions(Context context, String... permissions) { if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.M && context != null && permissions != null) { for (String permission : permissions) { if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) { return false; } } } return true; }
}
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With