在请求运行时权限时选中“不再询问”框是不是会禁用未来的对话框?

Posted

技术标签:

【中文标题】在请求运行时权限时选中“不再询问”框是不是会禁用未来的对话框?【英文标题】:Does checking the Never ask again box when asking for a runtime permission disable future dialogs?在请求运行时权限时选中“不再询问”框是否会禁用未来的对话框? 【发布时间】:2015-12-27 12:51:10 【问题描述】:

如果用户在选中不再询问的情况下拒绝运行时权限,这是否会禁用任何未来请求相同权限的能力?用户是否必须通过设置才能启用该权限?

在我的应用程序中,当我调用时

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

并且该权限之前已被拒绝并选中不再询问,它根本不会显示对话框。这是预期的行为吗?

【问题讨论】:

【参考方案1】:

是的,它将禁用。 但是,您可以做一些事情来检测用户是否设置了某些权限以不再请求。可以在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 的权限。

【讨论】:

【参考方案2】:

是的 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;
        
     

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

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

【讨论】:

您可以将(Build.VERSION.SDK_INT >= 23 && !shouldShowRequestPermissionRationale(permissions[0])) 替换为ActivityCompat.shouldShowRequestPermissionRationale(this, permission) 谢谢@MashukKhan ,它真的帮助了我......我很困惑如何放置这个逻辑【参考方案3】:

这是预期的行为。

来自the documentation:

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

【讨论】:

有什么方法可以让我只在选择不再询问时才发送消息?

以上是关于在请求运行时权限时选中“不再询问”框是不是会禁用未来的对话框?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Flutter 中请求和检查权限

Android运行时权限中永远不会显示“不再询问”复选框

借助复选框控件 (MFC) 启用/禁用编辑框

axure交互样式(下拉列表和矩形)

如何忘记 Android M 运行时权限对话框中的“不再询问”选项

如何处理 Android 运行时权限中的“不再询问”复选框?