Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

In onRequestPermissionsResult grantResults on some device return empty when user decline the permission

In Shot:, In onRequestPermissionsResult grantResults on some device return empty and some device have a value PackageManager.PERMISSION_DENIED when user decline the permission.

I have implmeneted a solution for identify user has selected accepted ,deny and deny with don't ask again for run time permission,based on https://stackoverflow.com/a/31925748/2941375 answer.

as per many docs i have seen,if user decline permission then it returns grantResults empty

Code i have used else if (grantResults[0] == PackageManager.PERMISSION_DENIED) so in else if part it throw Arrayindexoutofbound exception

i have tested code when user decline permission grantResults is not emplty for my case,but i have seen crash report on fabric console for grantResults there is many crash with arrayindexoutofbound,

 @Override
    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        super.onRequestPermissionsResult(requestCode, permissions, grantResults);
        switch (requestCode) {
            case PermissionManager.MY_PERMISSIONS_REQUEST_LOCATION_ACCESS: {
                // If request is cancelled, the result arrays are empty.
                if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                    DefineLocationService.start(this);
                    startNextActivity(0);
                } else if (grantResults[0] == PackageManager.PERMISSION_DENIED) {
                    boolean showRationale = ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[0]);
                    if (!showRationale) {
                        // user also CHECKED "never ask again"
                        // you can either enable some fall back,
                        // disable features of your app
                        // or open another dialog explaining
                        // again the permission and directing to
                        // the app setting
                        startNextActivity(ARTIFICIAL_DELAY_MILLIS);
                    } else if (!PermissionManager.MY_REQUESTED_DIALOG) {
                        PermissionManager.checkLocationPermission(this);
                    } else {
                        startNextActivity(0);
                    }
                } else {
                    startNextActivity(ARTIFICIAL_DELAY_MILLIS);
                }


            }
        }
    }

can anyone have any explanation for this,why some device return grantResults empty and some device return grantResults have value with decline when user decline permission.

i have tested many time but grantResults never empty on my side,but there is crash on console,it means in some case it is empty and grantResults[0] throw the exception.

like image 845
MJM Avatar asked Jun 09 '18 04:06

MJM


People also ask

How can I tell if an Android user is denied permission?

The method shouldShowRequestPermissionRationale() can be used to check whether the user selected the 'never asked again' option and denied the permission.

How to check if a permission is granted Android?

To check if the user has already granted your app a particular permission, pass that permission into the ContextCompat. checkSelfPermission() method. This method returns either PERMISSION_GRANTED or PERMISSION_DENIED , depending on whether your app has the permission.

How to handle permissions in Android?

Handle the permissions request response When the user responds to your app's permission request, the system invokes your app's onRequestPermissionsResult() method. So you have to override that method to find out whether the permission was granted or denied.


1 Answers

As per the documentation:

Note: It is possible that the permissions request interaction with the user is interrupted. In this case you will receive empty permissions and results arrays which should be treated as a cancellation.

How you want to deal with cancellation is totally up to you (re-ask for permission, treat it as a denial, etc), so just make sure to account for that case in your code.

like image 151
ianhanniballake Avatar answered Sep 19 '22 19:09

ianhanniballake