Search code examples
androidandroid-lvlruntime-permissions

ContextCompat.checkSelfPermission(Context, Manifest.permission.CAMERA) alway return granted


I use Android API lvl 23 in my application. When I check Camera permission, the ContextCompat.checkSelfPermission always return 0 (== PackageManager.PERMISSION_GRANTED)

I managed to change it from ContextCompat to ActivityCompat.

Here is my code:

public static boolean verify(Activity activity, final String[] PERMISSIONS, final int PERMISSIONS_REQUEST_ID) {
    if (underAPI23())
        return true;

    String[] denyPermission = new String[PERMISSIONS.length];
    int denyPermissionLength = 0;
    boolean shouldShowRequest = false;

    for (int i = 0; i < PERMISSIONS.length; i++) {
        int check = ContextCompat.checkSelfPermission(activity, PERMISSIONS[i]);
        LogUtils.e(TAG, PERMISSIONS[i] + ": " + (check != PackageManager.PERMISSION_GRANTED));
        // ===== ===== =====
        // This always return true. :'(
        // ===== ===== =====
        if (check != PackageManager.PERMISSION_GRANTED) {
            denyPermission[denyPermissionLength++] = PERMISSIONS[i];
            if (shouldShowRequest == false) {
                boolean should = ActivityCompat.shouldShowRequestPermissionRationale(activity, PERMISSIONS[i]);
                if (should)
                    shouldShowRequest = true;
            }
        }
    }

    if (denyPermissionLength > 0) {
        if (shouldShowRequest) {
            ActivityCompat.requestPermissions(activity, denyPermission, PERMISSIONS_REQUEST_ID);
        } else {
            ActivityCompat.requestPermissions(activity, denyPermission, PERMISSIONS_REQUEST_ID);
        }
        return false;
    } else {
        return true;
    }
}

My dependencies in Gradle build

dependencies {
    //...
    compile 'com.android.support:support-v4:23.2.0'
    compile 'com.android.support:appcompat-v7:23.2.0'
    //...
}

Updated: Permission call

if (PermissionGrant.verify(getActivity(), new String[]{Manifest.permission.CAMERA}, GRANT_TAKE_PHOTO)) {
    // Do my jobs
}

Solution

  • Your permission should be Manifest.permission.<Android permission> What is your Android target version? shouldShowRequestPermissionRationale always return false that mean ContextCompat.checkSelfPermission(activity, permission) always return false at Android API lvl under 23 too.

    Document here. Please focus on:

    Note: If the user turned down the permission request in the past and chose the Don't ask again option in the permission request system dialog, this method returns false. The method also returns false if a device policy prohibits the app from having that permission.