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 forgrantResults
there is many crash witharrayindexoutofbound
,
@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.
The method shouldShowRequestPermissionRationale() can be used to check whether the user selected the 'never asked again' option and denied the permission.
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.
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.
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With