【发布时间】:2018-11-19 02:57:58
【问题描述】:
In Shot:,当用户拒绝权限时,某些设备上的onRequestPermissionsResultgrantResults 返回空,并且某些设备的值PackageManager.PERMISSION_DENIED。
我已经实现了一个解决方案,用于识别用户选择了 accepted 、deny 和 deny with don't ask again 以获得运行时权限,基于https://stackoverflow.com/a/31925748/2941375 的回答。
根据我看到的许多文档,如果用户拒绝许可,则返回 grantResults 空
我使用了 else if (grantResults[0] == PackageManager.PERMISSION_DENIED) 的代码,所以在 else if 部分它会抛出 Arrayindexoutofbound 异常
当用户拒绝权限
grantResults不是时,我已经测试了代码 对我来说是空的,但我在织物控制台上看到了崩溃报告grantResultsarrayindexoutofbound有很多崩溃,
@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);
}
}
}
}
谁能对此有任何解释,为什么有些设备返回grantResults为空而有些设备返回grantResults在用户拒绝权限时具有拒绝的价值。
我已经测试了很多次,但是grantResults从来没有在我这边为空,但是在控制台上出现了崩溃,这意味着在某些情况下它是空的并且grantResults[0]抛出了异常。
【问题讨论】:
标签: android android-permissions permission-denied runtime-permissions