如果用户通过从不再询问选中否认运行时权限,这是否会禁用将来要求相同权限的任何功能?用户是否必须通过设置才能启用该权限?
在我的应用程序中,当我打电话
ActivityCompat.requestPermissions(this,
new String[]{Manifest.permission.READ_PHONE_STATE},
0)
此权限之前已被拒绝从不再询问选中,它根本不会显示对话框。这是预期的行为吗?
答案 0 :(得分:30)
是的,它会禁用。 但是,您可以执行某些操作来检测用户是否设置了一些不再请求的权限。您可以使用onRequestPermissionsResult()
方法
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
for(String permission: permissions){
if(ActivityCompat.shouldShowRequestPermissionRationale(this, permission)){
//denied
Log.e("denied", permission);
}else{
if(ActivityCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED){
//allowed
Log.e("allowed", permission);
} else{
//set to never ask again
Log.e("set to never ask again", permission);
//do something here.
}
}
}
}
我准备了一个帮助程序库,允许在GitHub上处理这样的转义here。
答案 1 :(得分:16)
这是预期的行为。
当系统要求用户授予权限时,用户可以选择告知系统不再要求该权限。在这种情况下,只要应用使用
requestPermissions()
再次请求该权限,系统会立即拒绝该请求。系统会调用您的onRequestPermissionsResult()
回调方法并传递PERMISSION_DENIED
,就像用户再次明确拒绝您的请求一样。这意味着当您致电requestPermissions()
时,您无法假设与用户进行任何直接互动。
答案 2 :(得分:16)
是James McCracken这是预期的行为。如果用户选择了“再询问”,那么您可以打开该请求权限对话框。但您可以向用户显示信息。
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case REQUEST_CODE:
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
Toast.makeText(MainActivity.this, "Permission Granted", Toast.LENGTH_SHORT).show();
// do your work here
} else if (Build.VERSION.SDK_INT >= 23 && !shouldShowRequestPermissionRationale(permissions[0])) {
Toast.makeText(MainActivity.this, "Go to Settings and Grant the permission to use this feature.", Toast.LENGTH_SHORT).show();
// User selected the Never Ask Again Option
} else {
Toast.makeText(MainActivity.this, "Permission Denied", Toast.LENGTH_SHORT).show();
}
break;
}
}
如果您想在用户选择" Never Again Again"之后打开设置屏幕。选项然后使用下面的代码
Intent i = new Intent();
i.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
i.addCategory(Intent.CATEGORY_DEFAULT);
i.setData(Uri.parse("package:" + context.getPackageName()));
i.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
i.addFlags(Intent.FLAG_ACTIVITY_NO_HISTORY);
i.addFlags(Intent.FLAG_ACTIVITY_EXCLUDE_FROM_RECENTS);
context.startActivity(i);