请求运行时权限时是否检查永不再问框禁用未来的对话框?

如果用户拒绝再次检查运行时权限,是否会禁用将来要求相同权限的任何function? 用户是否必须通过设置才能启用该权限?

在我的申请中,当我打电话

ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_PHONE_STATE}, 0)

并且该权限先前已被拒绝, 再次从不询问检查,它根本不会显示对话框。 这是预期的行为?

Solutions Collecting From Web of "请求运行时权限时是否检查永不再问框禁用未来的对话框?"

这是预期的行为。

从文档 :

当系统要求用户授予权限时, 用户可以select告诉系统不要再次请求该权限 。 在这种情况下,任何时候应用程序使用requestPermissions()来再次请求该权限, 系统立即拒绝该请求 。 系统调用您的onRequestPermissionsResult()callback方法并传递PERMISSION_DENIED ,就像用户明确拒绝您的请求一样。 这意味着当你调用requestPermissions() ,你不能认为与用户发生了任何直接的交互。

是的,它会禁用。 但是,您可以执行一些操作来检测用户是否设置了一些不再请求的权限 。 你可以在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上准备了一个帮助程序库来处理这种联系。

是James McCracken这是预期的行为。 如果用户select“永不再提问”,则无法打开请求权限对话框。 但是您可以将信息显示给用户。

 @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; } } 

如果你想在用户select“永远不要再问”选项后打开设置屏幕,则使用下面的代码

 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);