在要求运行时权限时检查"永不再询问"框是否会禁用将来的对话框?

Jam*_*ken 18 android android-permissions

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

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

ActivityCompat.requestPermissions(this, 
            new String[]{Manifest.permission.READ_PHONE_STATE}, 
            0)
Run Code Online (Sandbox Code Playgroud)

并且该权限先前已被拒绝,而且再也没有要求检查,它根本不会显示对话框.这是预期的行为吗?

Nab*_*ari 32

是的它会禁用.但是,您可以执行某些操作来检测用户是否设置了一些不再请求的权限.你可以在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.
                }
            }
        }
}
Run Code Online (Sandbox Code Playgroud)

我准备了一个辅助库的权限来处理这种contition 这里 GitHub上.


Ada*_*m S 17

这是预期的行为.

文档:

当系统要求用户授予权限时,用户可以选择告知系统不要再次请求该权限.在这种情况下,只要应用程序requestPermissions()再次请求该权限,系统就会立即拒绝该请求.系统调用您的onRequestPermissionsResult()回调方法并传递PERMISSION_DENIED,就像用户再次明确拒绝您的请求一样.这意味着当您致电时requestPermissions(),您不能假设与用户进行任何直接交互.


Mas*_*han 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;
        }
    } 
Run Code Online (Sandbox Code Playgroud)

如果您想在用户选择"永不再问"选项后打开设置屏幕,请使用以下代码

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);
Run Code Online (Sandbox Code Playgroud)