Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

checkSelfPermission method is not working in targetSdkVersion 22

CheckSelfPermission method is not working as expected and it is always returning zero in android 6.0(Marshmallow). Because the target sdk is 22 and i am using http Client for network connection. Following is the code snippet.

private void insertDummyContactWrapper() {     List<String> permissionsNeeded = new ArrayList<String>();      final List<String> permissionsList = new ArrayList<String>();     if (!addPermission(permissionsList, Manifest.permission.ACCESS_FINE_LOCATION))         permissionsNeeded.add("GPS");     if (!addPermission(permissionsList, Manifest.permission.READ_CONTACTS))         permissionsNeeded.add("Read Contacts");     if (!addPermission(permissionsList, Manifest.permission.WRITE_CONTACTS))         permissionsNeeded.add("Write Contacts");      if (permissionsList.size() > 0) {         if (permissionsNeeded.size() > 0) {             // Need Rationale             String message = "You need to grant access to " + permissionsNeeded.get(0);             for (int i = 1; i < permissionsNeeded.size(); i++)                 message = message + ", " + permissionsNeeded.get(i);             showMessageOKCancel(message,                     new DialogInterface.OnClickListener() {                         @Override                         public void onClick(DialogInterface dialog, int which) {                             requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),                                     REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);                         }                     });             return;         }         requestPermissions(permissionsList.toArray(new String[permissionsList.size()]),                 REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS);         return;     }      insertDummyContact(); }  @TargetApi(Build.VERSION_CODES.M) private boolean addPermission(List<String> permissionsList, String permission) {     if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) {         permissionsList.add(permission);         // Check for Rationale Option         if (!shouldShowRequestPermissionRationale(permission)) return false;     }     return true; }  private void showMessageOKCancel(String message, DialogInterface.OnClickListener okListener) {     new AlertDialog.Builder(MainActivity.this)             .setMessage(message)             .setPositiveButton("OK", okListener)             .setNegativeButton("Cancel", null)             .create()             .show(); }  @Override public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {     switch (requestCode) {         case REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS: {             Map<String, Integer> perms = new HashMap<String, Integer>();             // Initial             perms.put(Manifest.permission.ACCESS_FINE_LOCATION, PackageManager.PERMISSION_GRANTED);             perms.put(Manifest.permission.READ_CONTACTS, PackageManager.PERMISSION_GRANTED);             perms.put(Manifest.permission.WRITE_CONTACTS, PackageManager.PERMISSION_GRANTED);             // Fill with results             for (int i = 0; i < permissions.length; i++)                 perms.put(permissions[i], grantResults[i]);             // Check for ACCESS_FINE_LOCATION             if (perms.get(Manifest.permission.ACCESS_FINE_LOCATION) == PackageManager.PERMISSION_GRANTED && perms.get(Manifest.permission.READ_CONTACTS) == PackageManager.PERMISSION_GRANTED && perms.get(Manifest.permission.WRITE_CONTACTS) == PackageManager.PERMISSION_GRANTED) {                 // All Permissions Granted                 insertDummyContact();             } else {                 // Permission Denied                 Toast.makeText(MainActivity.this, "Some Permission is Denied", Toast.LENGTH_SHORT)                         .show();             }         }         break;         default:             super.onRequestPermissionsResult(requestCode, permissions, grantResults);     } }" 
like image 622
Mithun S Avatar asked Oct 29 '15 06:10

Mithun S


1 Answers

  1. If your application is targeting API level before 23 (Android M) then both: ContextCompat#checkSelfPermission and Context#checkSelfPermission won't work and always return 0 (PERMISSION_GRANTED). Even if you run the application on Android 6.0 (API 23).

  2. It isn't fully true that if you targeting API level before 23 then you don't have to take care of permissions. If your application is targeting API level before 23 and target device Android version is:

    • Android < 6.0: Everything will be ok.
    • Android 6.0: Application's run-time permissions will be granted by default (compatibility mode applies), but the user can change run-time permissions in Android Settings, then you may have problems.
  3. As I said in the 1st point, if you targeting API level before 23 on Android 6.0 then ContextCompat#checkSelfPermission and Context#checkSelfPermission won't work. Fortunately you can use PermissionChecker#checkSelfPermission to check run-time permissions.

Example code:

    public boolean selfPermissionGranted(String permission) {         // For Android < Android M, self permissions are always granted.         boolean result = true;          if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {                          if (targetSdkVersion >= Build.VERSION_CODES.M) {                 // targetSdkVersion >= Android M, we can                 // use Context#checkSelfPermission                 result = context.checkSelfPermission(permission)                         == PackageManager.PERMISSION_GRANTED;             } else {                 // targetSdkVersion < Android M, we have to use PermissionChecker                 result = PermissionChecker.checkSelfPermission(context, permission)                         == PermissionChecker.PERMISSION_GRANTED;             }         }          return result;     } 

To get target Sdk Version you can use:

    try {         final PackageInfo info = context.getPackageManager().getPackageInfo(                 context.getPackageName(), 0);         targetSdkVersion = info.applicationInfo.targetSdkVersion;     } catch (PackageManager.NameNotFoundException e) {         e.printStackTrace();     } 

It works on Nexus 5 with Android M.

like image 133
MikePtr Avatar answered Sep 21 '22 03:09

MikePtr