在镜头中:,在
onRequestPermissionsResult
中,某些设备上的 grantResults 返回空,而当用户拒绝权限时,某些设备上有一个值 PackageManager.PERMISSION_DENIED
。
我已经实现了一个解决方案,用于识别用户已选择接受、拒绝和拒绝,并且不再询问运行时权限,基于https://stackoverflow.com/a/31925748/2941375回答。
根据我见过的许多文档,如果用户拒绝许可,则会返回
grantResults
空
我使用的代码
else if (grantResults[0] == PackageManager.PERMISSION_DENIED)
所以在else if
部分它抛出Arrayindexoutofbound异常
我已经测试了用户拒绝权限时的代码
不是 对于我的情况来说是空的,但我已经在织物控制台上看到了崩溃报告grantResults
有很多崩溃grantResults
,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);
}
}
}
}
任何人都可以对此有任何解释吗,为什么有些设备返回
grantResults
为空,而有些设备返回 grantResults
当用户拒绝许可时具有下降的价值。
我已经测试了很多次,但是
grantResults
在我这边从来没有空过,但是控制台上有崩溃,这意味着在某些情况下它是空的并且grantResults[0]
抛出异常。
根据文档:
注意:与用户的权限请求交互可能会被中断。在这种情况下,您将收到空的权限和结果数组,应将其视为取消。
如何处理取消完全取决于您(重新请求许可、将其视为拒绝等),因此请确保在代码中考虑到这种情况。
当我忘记在清单文件中指定权限时,我遇到了同样的问题(在我的例子中是
POST_NOTIFICATIONS
)。一旦我添加了
<uses-permission android:name="android.permission.POST_NOTIFICATIONS" />
一切都开始按预期进行。