22

I would like to know if there is a way we can identify the event when the user has pressed "Allow" button for contact details access/ calendar access etc.,

I know there is a way to ask for permissions with the ActivityCompat.requestPermissions but is there a way to perform an action right after the user grants a permission?

Katakam Nikhil
  • 1,375
  • 4
  • 14
  • 22
  • 1
    Yes. The callback function `onRequestPermissionsResult(..)` which returns the result of the prompt can be used to execute any further code. – Pztar Jan 12 '17 at 18:36

3 Answers3

43

First Define the variable:

public static int MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION = 1;

…then use the following code copied from http://web.archive.org/web/20160111030837/http://developer.android.com/training/permissions/requesting.html

request permission using:

if (ActivityCompat.checkSelfPermission(this,
        android.Manifest.permission.ACCESS_FINE_LOCATION)
        != PackageManager.PERMISSION_GRANTED) {
    // Should we show an explanation?
    if (ActivityCompat.shouldShowRequestPermissionRationale(this,
            android.Manifest.permission.ACCESS_FINE_LOCATION)) {
        // Show an explanation to the user *asynchronously* -- don't block
        // this thread waiting for the user's response! After the user
        // sees the explanation, try again to request the permission.
    } else {
        // No explanation needed, we can request the permission.
        ActivityCompat.requestPermissions(this,
                new String[]{Manifest.permission.ACCESS_FINE_LOCATION},
MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION);
        // MY_PERMISSIONS_REQUEST_READ_CONTACTS is an
        // app-defined int constant. The callback method gets the
        // result of the request.
    } }

now catch the result using:

     @Override public void onRequestPermissionsResult(int requestCode,
        String permissions[], int[] grantResults) {
    switch (requestCode) {
        case MY_PERMISSIONS_REQUEST_ACCESS_FINE_LOCATION : {
            // 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.
                Toast.makeText(getApplicationContext(), "Permission granted", Toast.LENGTH_SHORT).show();

            } else {

                // permission denied, boo! Disable the
                // functionality that depends on this permission.
                Toast.makeText(getApplicationContext(), "Permission denied", Toast.LENGTH_SHORT).show();
            }
            return;
        }

        // other 'case' lines to check for other
        // permissions this app might request
    } }

FOR FRAGMENT

if you are trying this code in a fragment, change

checkSelfPermission()

to

ActivityCompact.checkSelfPermission()

and Also change

ActivityCompat.requestPermissions()

to

requestPermissions()

Handling of Permission Result (Allow or Deny) are same as activity.

For a More Complete Example See This Answer Here

sideshowbarker
  • 81,827
  • 26
  • 193
  • 197
  • Thank you @rafsanahmad007 This is what I was looking for – Katakam Nikhil Jan 12 '17 at 19:48
  • Uninstall and clean build apk...make sure to add permission in manifest also...the permission dialog will not show for android version less than marsmallow. –  Nov 01 '17 at 10:04
  • if grantResults[0] already == PackageManager.PERMISSION_GRANTED?, obviously grantResults.length > 0 so isn't that condition verification redundant? – Red M Nov 18 '17 at 17:30
  • ActivityCompact should be ActivityCompat. It's only 1 character, so I can't submit an edit – Shenk Aug 20 '19 at 17:31
4

I used this code for that very purpose.

   public boolean isPermissionGranted() {

    if (Build.VERSION.SDK_INT >= 23) {
        if (checkSelfPermission(Manifest.permission.WRITE_EXTERNAL_STORAGE)
                == PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.READ_EXTERNAL_STORAGE)
                == PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.CAMERA)
                == PackageManager.PERMISSION_GRANTED) {
            Log.v(TAG, "Permission is granted");
            return true;
        } else {
            ActivityCompat.requestPermissions(this, new String[]{
                    Manifest.permission.CAMERA
            }, 1);
            return false;
        }
    } else { //permission is automatically granted on sdk<23 upon installation
        Log.v(TAG, "Permission is granted");
        return true;
    }

}

You can then call :

    if(isPermissionGranted())
    {
       // do your stuff
    }
MezzDroid
  • 560
  • 4
  • 11
1

Call requestPermissions() to request the permissions. You find out the result in onRequestPermissionsResult() and can determine if they granted the permission or not. That is "right after", from the standpoint of your app's code.

CommonsWare
  • 986,068
  • 189
  • 2,389
  • 2,491