Search code examples
androidandroid-permissionspermission-deniedruntime-permissions

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.


Solution

  • 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.