Ask for runtime permission only for Android Marshmallow?

孤者浪人 提交于 2019-12-04 15:01:47

It is easy to get multiple permissions at a single shot.

I hope below code can help you out for granting multiple permissions.

private  void  requestpermissioncamera()
{
    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(!addPermission(permissionsList,Manifest.permission.CAMERA))
permissionsNeeded.add("Camera");
    if(!addPermission(permissionsList, Manifest.permission.ACCESS_NOTIFICATION_POLICY))
permissionsNeeded.add("push Notification");

    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;
}
@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);
    perms.put(Manifest.permission.CAMERA, PackageManager.PERMISSION_GRANTED);
    perms.put(Manifest.permission.ACCESS_NOTIFICATION_POLICY, 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);
}

Of course it is. You can see an example of how it's implemented below:

public String[] PERMISSIONS_STORAGE = {
      Manifest.permission.READ_EXTERNAL_STORAGE, Manifest.permission.WRITE_EXTERNAL_STORAGE
  };


public boolean verifyStoragePermissions(Activity activity, int REQUEST_EXTERNAL_STORAGE) {

    initialize(activity);

    // Check if we have write permission
    int permission =
        ActivityCompat.checkSelfPermission(activity, Manifest.permission.WRITE_EXTERNAL_STORAGE);
    if (permission != PackageManager.PERMISSION_GRANTED) {
      // We don't have permission so prompt the user
      ActivityCompat.requestPermissions(activity, PERMISSIONS_STORAGE, REQUEST_EXTERNAL_STORAGE);
      return false;
    } else {
      return true;
    }
  }

for my project i made Utils class with this method:

public static boolean checkAllAndRequestPermisions(Activity activity, int requestCode, LinkedList<String> permissionsList) {
       LinkedList<String> needPermissions = new LinkedList<>();
        for(String permission : permissionsList){
           if (ContextCompat.checkSelfPermission(activity, permission) != activity.getPackageManager().PERMISSION_GRANTED){
               needPermissions.add(permission);
           }
        }
        if (!needPermissions.isEmpty()){
                ActivityCompat.requestPermissions(activity, needPermissions.toArray(new String[needPermissions.size()]), requestCode);
        }
            return true;
    }

And implement onRequestPermissinsResult interface like this:

@Override
    public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
        switch (requestCode) {
            case Consts.SOME_PERMISSIONS_REQUEST_CODE: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

                } else {
                    Toast.makeText(getApplicationContext(), "Need permissions", Toast.LENGTH_LONG).show();
                }
                return;
            }
            // other 'case' lines to check for other
            // permissions this app might request
        }
    }

Its not perfect solution, but ok for first time, i hope its help.

Also dont forget, you can set in gradle targetSdkVersion less then 23 to have time for implement all requests permissions functionality.

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!