5

I'm handling my application code to work in Marshmallow devices, I'm managing its permissions dialog to show in needed places.

Currently held up with this scenario where it required two permission (Location and Storage) and I want to ask one by one like how Hangout does. Couldn't find how it's customized, any solution?

enter image description here enter image description here

Here is the code I handle for single permission:

case REQUEST_CODE_WRITE_EXTERNAL_STORAGE: {

    if (checkSelfPermission(android.Manifest.permission.WRITE_EXTERNAL_STORAGE) == PackageManager.PERMISSION_GRANTED) {
        /Permission is granted
        Toast.makeText(this, "SDK >= 23 & permission Granted ", Toast.LENGTH_SHORT).show();
        return true;

    } else {
        //Permission is revoked
        ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE}, REQUEST_CODE_WRITE_EXTERNAL_STORAGE);
        return false;
    }
}

And in onRequestPermissionsResult():

case REQUEST_CODE_WRITE_EXTERNAL_STORAGE: {

    // If request is cancelled, the result arrays are empty.
    if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {

        // permission was granted, yay! Do the
        // contacts-related task you need to do.
        Log.e("PMS", "granted");
        Toast.makeText(this, "SDK >= 23 & permission Granted ", Toast.LENGTH_SHORT).show();

    } else {
        Log.e("PMS", "Not Granted");

        // permission denied, boo! Disable the
        // functionality that depends on this permission.
        int checkStatus = getPermissionStatus(Manifest.permission.WRITE_EXTERNAL_STORAGE);
        if (checkStatus == 3) {
            Toast.makeText(this, "SDK  >= 23 & permission Denied ", Toast.LENGTH_SHORT).show();

        } else if (checkStatus == 4) {
            Toast.makeText(this, "SDK  >= 23 & permission Blocked ", Toast.LENGTH_SHORT).show();

        }
    }
    return;
}
Floern
  • 33,559
  • 24
  • 104
  • 119
SaravanaRaja
  • 3,228
  • 2
  • 21
  • 29

4 Answers4

2

For requesting multiple permission one by one you need to add all permission in second parameter String[] ActivityCompat.requestPermissions method. Like this:

ActivityCompat.requestPermissions(this, new String[]{android.Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_CODE_WRITE_EXTERNAL_STORAGE);

Let me know if it helps

Sagar Trehan
  • 2,401
  • 2
  • 24
  • 32
1

Check this post https://stackoverflow.com/a/35495855/403255 for detailed answer. I've added WRITE_EXTERNAL_STORAGE to @nicks answer.

public static final int REQUEST_MULTIPLE_PERMISSIONS_ID = 456;
@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    if(checkAndRequestPermissions()) {
        // TODO - all permissions granted already
    }
}

private  boolean checkAndRequestPermissions() {
    int permissionSendMessage = ContextCompat.checkSelfPermission(this,
            Manifest.permission.WRITE_EXTERNAL_STORAGE);
    int locationPermission = ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION);
    List<String> listPermissionsNeeded = new ArrayList<>();
    if (locationPermission != PackageManager.PERMISSION_GRANTED) {
        listPermissionsNeeded.add(Manifest.permission.ACCESS_FINE_LOCATION);
    }
    if (permissionSendMessage != PackageManager.PERMISSION_GRANTED) {
        listPermissionsNeeded.add(Manifest.permission.WRITE_EXTERNAL_STORAGE);
    }
    if (!listPermissionsNeeded.isEmpty()) {
        ActivityCompat.requestPermissions(this, listPermissionsNeeded.toArray(new String[listPermissionsNeeded.size()]),REQUEST_MULTIPLE_PERMISSIONS_ID);
        return false;
    }
    return true;
}
Community
  • 1
  • 1
Vinothkumar Arputharaj
  • 4,567
  • 4
  • 29
  • 36
0

I use a permission util for this:

import android.app.Activity;
import android.content.Context;
import android.content.pm.PackageManager;
import android.support.annotation.NonNull;
import android.support.v4.app.ActivityCompat;
import android.support.v4.content.ContextCompat;
import android.util.Log;



/**
 * Permission Utils
 */
public final class PermissionUtils {

    public static final String PER_READ_PHONE_STATE = Manifest.permission.READ_PHONE_STATE;
    public static final String PER_GET_ACCOUNTS = Manifest.permission.GET_ACCOUNTS;
    public static final String PER_WAKE_LOCK = Manifest.permission.WAKE_LOCK;
    public static final String FEEDBACK_PERMISSION_REQUEST_CODE = 1001;


    private PermissionUtils() {
    }

    public static boolean checkPermissions(Context context, String... permissions) {
        for (String permission : permissions) {
            if (!checkPermission(context, permission)) {
                return false;
            }
        }
        return true;
    }

    public static boolean AllPermissionsGranted(Context context) {
        return IsAccountsInfoGranted(context) && IsDeviceInfoGranted(context);
    }

    public static boolean checkPermission(Context context, String permission) {
        return ContextCompat.checkSelfPermission(context, permission) == PackageManager.PERMISSION_GRANTED;
    }

    //define functions for each permission
    public static boolean IsWakeLockGranted(Context context) {
        return checkPermission(context, PER_WAKE_LOCK);
    }

    public static boolean IsAccountsInfoGranted(Context context) {
        return checkPermission(context, PER_GET_ACCOUNTS);
    }

    public static boolean IsDeviceInfoGranted(Context context) {
        return checkPermission(context, PER_READ_PHONE_STATE);
    }

    public static boolean PermissionsGranted(@NonNull int[] permissionResults) {
        if (permissionResults.length > 0) {
            for (int permission : permissionResults) {
                if (permission != PackageManager.PERMISSION_GRANTED)
                    return false;
            }
            return true;
        } else return false;
    }

    public static void RequestPermissions(Activity activity, int permissionId, String... permissions) {
        ActivityCompat.requestPermissions(activity, permissions, permissionId);
    }
}

use this code to request permissions in wherever you want :

String[] permissions = new String[]{PermissionUtils.PER_GET_ACCOUNTS, PermissionUtils.PER_READ_PHONE_STATE};
PermissionUtils.RequestPermissions(Act_Launch.this, PermissionUtils.FEEDBACK_PERMISSION_REQUEST_CODE, permissions);

And this method in activity to handle the app permission or denial

    /***************************************
     * RequestPermissionResult
     ***************************************/
    @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        switch (requestCode) {
            case PermissionUtils.PERMISSION_REQUEST_CODE:
                if (PermissionUtils.PermissionsGranted(grantResults)) {
                    ShowRegistrationView();
                } else {
                   //Do Whatever you want
                }
                break;
            default:
                super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        }
    }
Arun Shankar
  • 2,603
  • 2
  • 26
  • 36
0

You need to send several permissions at the same time in an array. I recommend you to use PermissionHelper or PermissionsDispatcher libraries. Then you can just request it like this:

permissionHelper
     .setForceAccepting(false)// true if you had like force reshowing the permission dialog on Deny (not recommended)
     .request(MULTIPLE_PERMISSIONS_ARRAY);

I hope it helps!

Isaac Urbina
  • 1,295
  • 11
  • 21