Java – Android targetSdkVersion 23 checkSelfPermission method

Android targetSdkVersion 23 checkSelfPermission method… here is a solution to the problem.

Android targetSdkVersion 23 checkSelfPermission method

I’m having trouble checking permission values in Android 6.0 (API 23). You always get a value of 0 even if you enable or disable permissions from the application’s settings.

Here are the steps I took.

Manually disable contact permissions from Device Settings – > Apps – > My Apps - > Permissions - > Disable Contact Permissions.

Still in Android 6.0, you get a value of 0 every time you execute the following line of code.

ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_CONTACTS)

Below is my code. I define it in the main launcher Activity class

// Identifier for the permission request
private static final int WRITE_CONTACTS_PERMISSIONS_REQUEST = 9;
........

@Override
public void onCreate(Bundle savedInstanceState) {
....
if (android.os.Build.VERSION.SDK_INT <= android.os.Build.VERSION_CODES. LOLLIPOP_MR1)
    {
        sharedPreferencesEditor.putBoolean(getString(R.string.ALLOW_ACCESS_PHONEBOOK), true);
        sharedPreferencesEditor.commit();
    }
    else {
        getPermissionToReadUserContacts();
    }
....

}

 Called when the user is performing an action which requires the app to read the
 user's contacts
public void getPermissionToReadUserContacts() {
     1) Use the support library version ContextCompat.checkSelfPermission(...) to avoid
     checking the build version since Context.checkSelfPermission(...) is only available
     in Marshmallow
     2) Always check for permission (even if permission has already been granted)
     since the user can revoke permissions at any time through Settings
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.WRITE_CONTACTS)
            != PackageManager.PERMISSION_GRANTED) {

 The permission is NOT already granted.
         Check if the user has been asked about this permission already and denied
         it. If so, we want to give more explanation about why the permission is needed.
        if (shouldShowRequestPermissionRationale(
                Manifest.permission.WRITE_CONTACTS)) {
             Show our own UI to explain to the user why we need to read the contacts
             before actually requesting the permission and showing the default UI
        }

 Fire off an async request to actually get the permission
         This will show the standard permission request dialog UI
        requestPermissions(new String[]{Manifest.permission.WRITE_CONTACTS},
                WRITE_CONTACTS_PERMISSIONS_REQUEST);
    }
}

 Callback with the request from calling requestPermissions(...)
@Override
public void onRequestPermissionsResult(int requestCode,
                                       @NonNull String permissions[],
                                       @NonNull int[] grantResults) {
     Make sure it's our original READ_CONTACTS request
    if (requestCode == WRITE_CONTACTS_PERMISSIONS_REQUEST) {
        if (grantResults.length == 1 &&
                grantResults[0] == PackageManager.PERMISSION_GRANTED) {
            Toast.makeText(this, "Write Contacts permission granted", Toast.LENGTH_SHORT).show();
        } else {
            Toast.makeText(this, "Write Contacts permission denied", Toast.LENGTH_SHORT).show();
        }
    } else {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
    }
}

Solution

If your target SDK 23 (Android 6), all permissions (in your list) are disabled by default, while if your targetSDK is 22 (Android 5.1) and your app is running on Android 6, all permissions are enabled by default when the user installs the app, even if the user revokes the permissions later, check SelfPermission An incorrect value of PERMISSION_GRANTED is also returned

It can also be found in PermissionChecker found in the documentation.

In the new permission model permissions with protection level dangerous are runtime permissions. For apps targeting M and above the user may not grant such permissions or revoke them at any time. For apps targeting API lower than M these permissions are always granted as such apps do not expect permission revocations and would crash. Therefore, when the user disables a permission for a legacy app in the UI the platform disables the APIs guarded by this permission making them a no-op which is doing nothing or returning an empty result or default error.

Related Problems and Solutions