Search This Blog

Sunday, September 25, 2016

Checking multiple run time permission for marshmellow and above in android

Hello friend., Here i am posting tutorial for granting multiple permission with common code.. You need to add this code once and check permission run time.

Make one class in with common methods can be added in it. I call it CM as common methods. Add the following code in the common code.


CM.java

public static void showMessageOKCancel(Activity context, String message,                                                                                                              DialogInterface.OnClickListener okListener) {
           new AlertDialog.Builder(context)
                           .setMessage(message)
                           .setPositiveButton("OK", okListener)
                           .setNegativeButton("Cancel", null)
                           .create()
                           .show();
}

public static void applyMarshmallowPermission(
                          final Activity context, String Permission[], String[] strPermissionMessage, 
                          final int RequestCode, OnPermissionAlreadyGrant callBackPermission) {
            final List<String> permissionsList = new ArrayList<String>();
            List<String> permissionsNeeded = new ArrayList<String>();

             for (int i = 0; i < Permission.length; i++) {
                         if (!addPermission(context, permissionsList, Permission[i])) {
                                            permissionsNeeded.add(strPermissionMessage[i]);
                         }
             }

             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(context, message,
                                          new DialogInterface.OnClickListener() {
                                                  @Override
                                                   public void onClick(DialogInterface dialog, int which) {
                                                                  ActivityCompat.requestPermissions(context,                                                                                                     permissionsList.toArray(new                                                                                                                              String[permissionsList.size()]), RequestCode);
                                                   }
                                           });
                                  return;
                            }
                           ActivityCompat.requestPermissions(context, permissionsList.toArray(new                                                            String[permissionsList.size()]),  RequestCode);
                          return;
              }

               if (callBackPermission != null) {
                          callBackPermission.onPermssionAlreadyGranted();
                          return;
              }


}


private static boolean addPermission(Activity context, 
                                             List<String> permissionsList, String permission) {
                   
                            if (ActivityCompat.checkSelfPermission(context, permission) != PackageManager.PERMISSION_GRANTED) {
                                          permissionsList.add(permission);
                                          // Check for Rationale Option
                                          if (ActivityCompat.shouldShowRequestPermissionRationale(context, permission)) {
                                                            return false;
                                          }

                             }
       return true;

}

public static int checkNeverAskAgainList(Activity
                                                                context, String[] permissionsList) {
          int deniedList = 0;
          for (String strPermission : permissionsList) {
                   boolean isRational = ActivityCompat.shouldShowRequestPermissionRationale(context, strPermission);
                   if (isRational) {
                              deniedList++;
                   }
           }
   return deniedList;
}


public static void goToSettings(Activity context) {
                Intent myAppSettings = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + context.getPackageName()));
                myAppSettings.addCategory(Intent.CATEGORY_DEFAULT);
                myAppSettings.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
                context.startActivity(myAppSettings);
}


This methods are used to check for permissions that user has to allow or user will go to setting and allow the permission that our app needs.

Now how to use this for multiple permission grant in your activity using this methods.

Add this in your activity when you need to check the permissions

//Mention list of permissions that are needed in your activity
String strPermissoinList[] = new String[]{android.Manifest.permission.READ_PHONE_STATE,                                                      android.Manifest.permission.GET_ACCOUNTS};
// Description to be shown to user for particular permission if user denied once.
String strPermissionMessage[] = new String[]{"Phone State", "Google+ Account"};
// Request code to be used when permission is received from user
public static final int PERMISSION_MULTIPLE_GRANT_CODE = 1001;



public void buttonClick(View view) {
               CM.applyMarshmallowPermission(MainActivity.this, strPermissoinList,                                                          strPermissionMessage,                                                                                                           PERMISSION_MULTIPLE_GRANT_CODE, 
                                                new OnPermissionAlreadyGrant() { 
                   @Override
                   public void onPermssionAlreadyGranted() {
                              // if you have already granted or sdk version is below marshmellow
                              Toast.makeText(MainActivity.this, "You have allowed all permission.                                                                applyMarshmallowPermission : " +                                                                                      CM.getDeviceId(MainActivity.this),                                                                                        Toast.LENGTH_SHORT).show();
                  }
          });
}

Now add the following lines in the onRequestPermissionsResult code.

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
       switch (requestCode) {
             case PERMISSION_MULTIPLE_GRANT_CODE:

                    Map<String, Integer> perms = new HashMap<String, Integer>();
                    // Initial
                    perms.put(android.Manifest.permission.READ_PHONE_STATE, PackageManager.PERMISSION_GRANTED);
                    perms.put(android.Manifest.permission.GET_ACCOUNTS, PackageManager.PERMISSION_GRANTED);
                    // Fill with results
                    for (int i = 0; i < permissions.length; i++)
                            perms.put(permissions[i], grantResults[i]);
                      // Check for READ_PHONE_STATE
                      if (perms.get(android.Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED
                                       && perms.get(android.Manifest.permission.GET_ACCOUNTS) == PackageManager.PERMISSION_GRANTED) {
                                          Toast.makeText(this, "You have allowed all permission. onRequestPermissionsResult :: " + CM.getDeviceId(MainActivity.this), Toast.LENGTH_SHORT)
.show();

                       } else {

                           int countBlock = CM.checkNeverAskAgainList(this, strPermissoinList);
                           if (countBlock > 0) {
                                  // Permission Denied
                                   Toast.makeText(this, "You denied the permission", Toast.LENGTH_SHORT)
.show();
                            } else {
                                    CM.showMessageOKCancel(MainActivity.this, "Go to setting and give permission",
                                                                            new DialogInterface.OnClickListener() {
                                   @Override
                                   public void onClick(DialogInterface dialog, int which) {
                                                  CM.goToSettings(MainActivity.this);
                                   }
                             });
                    }
              }
              break;
          default:
               super.onRequestPermissionsResult(requestCode, permissions, grantResults);
       }
}

Finally the callback interface that you need to define in your code is below

public interface OnPermissionAlreadyGrant {
           void onPermssionAlreadyGranted();
}

No comments:

Post a Comment

Note: Only a member of this blog may post a comment.