Checking if permissions have been granted already

2019-02-12 11:45发布

问题:

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?

回答1:

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;
}

}



回答2:

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.permission.READ_CONTACTS";
int checkVal = getContext().checkCallingOrSelfPermission(requiredPermission);

Now you can check:

if (checkVal==PackageManager.PERMISSION_GRANTED){}


回答3:

Try by adding perms inside String[]{} it works for me..

for (int i = 0; i < perms.length; i++) {
        if(ContextCompat.checkSelfPermission(this,perms[i])!=PackageManager.PERMISSION_GRANTED)
        {
            ActivityCompat.requestPermissions(this,String[]{perms}, permsRequestCode);
            break;
        }
    }