【问题标题】:How to forget the "Never ask again" choice in Android M runtime permission dialog如何忘记 Android M 运行时权限对话框中的“不再询问”选项
【发布时间】:2016-02-10 03:22:41
【问题描述】:

我想知道“不再询问”复选框布尔标志的存储位置以及如何清除其值?不一定以编程方式,而是手动 - 通过设置、命令或某些工具。尝试清除应用程序数据,卸载,卸载和清除,尝试手动来回切换权限,甚至尝试为模拟器设置更新的棉花糖图像,但没有运气!

【问题讨论】:

  • 我相信如果你去设置然后应用程序并选择你的应用程序,它应该在某个地方。
  • 是的,没错,我只是无意中发现了“重置应用偏好”选项。到现在还不知道。
  • 不,它也不起作用! :( 删除我的答案!
  • 发现了问题,在我的代码中。我使用的是权限组而不是权限。取消删除它:)

标签: android android-6.0-marshmallow runtime-permissions


【解决方案1】:

唯一对我有用的解决方案是:

  1. 进入应用权限
  2. 启用和禁用所有权限

然后它会忘记“不再询问”选项

您可以在此视频中查看 https://www.youtube.com/watch?v=F8hQfmYTEaQ

【讨论】:

  • 这正是我所说的(同时发布了测试此页面上提供的所有其他解决方案的视频)一年半之前...
  • 我通常不喜欢浏览整个视频,以获取从图片中获得的信息。
【解决方案2】:
@Override
public void onRequestPermissionsResult(int requestCode, String permissions[], int[] grantResults) {
    boolean dontAsk = false;
    if (requestCode == REQUEST_CAM_STORAGE_PERMISSION) {
        for (String allowedPermissions : permissions) {
            if (ActivityCompat.shouldShowRequestPermissionRationale(context, allowedPermissions)) {
                Log.e("Permission: ", "User Has Denied Permission");
            } else if (PermissionChecker.checkCallingOrSelfPermission(context, allowedPermissions) != PackageManager.PERMISSION_GRANTED) {
                Log.e("Permission: ", "User Has Denied Permission with Don't Ask Again");
                dontAsk = true;
                break;
            } else {
                Log.e("Permission: ", "User Has Allowed Permission");
            }
        }

        if (!dontAsk) {
            Log.e("Permission: ", "Dont'Ask False");
            checkPermission();
        } else {
            Log.e("Permission: ", "Dont'Ask True");
            startActivity(new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS, Uri.parse("package:" + this.getPackageName())));
        }
    }
}

【讨论】:

    【解决方案3】:

    您可以通过清除应用设置中的数据来“忘记”它。

    编辑: 正如@me_ 指出的那样,仅清除应用程序数据可能不会重置某些设备中的“不再询问”条件。在这种情况下,手动打开然后关闭应用设置中的权限就可以了。

    但是,如果您想查找是否已将权限设置为不再请求,您可以使用onRequestPermissionsResult() 方法以编程方式检查它。

    public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
        for(String permission: permissions){
                if(ActivityCompat.shouldShowRequestPermissionRationale(this, permission)){
                    //denied
                }else{
                    if(ActivityCompat.checkSelfPermission(this, permission) == PackageManager.PERMISSION_GRANTED){
                        //allowed
                    } else{
                        //set to never ask again
                        Log.e("set to never ask again", permission);
                    }
                }
        }
    }
    

    PS:我已经在this 回答了完整的实现。

    【讨论】:

    【解决方案4】:

    https://www.youtube.com/watch?v=F8hQfmYTEaQ

    您应该在设置->应用程序权限区域中手动启用和禁用权限。

    我尝试了此页面上给出的所有建议。他们都没有工作。手动启用和禁用返回对话框。

    点击上面的 youtube 帖子验证这是正确的答案

    【讨论】:

      【解决方案5】:

      清除数据(设置 > 应用 > 你的应用 > 存储 > 清除数据)和卸载应用都会清除此标志的状态,同时清除与应用运行时权限相关的所有其他内容。

      此行为已在运行 Android 6.0 的 Nexus 5 上通过this sample app 进行了测试。

      我似乎记得在某处看到过手动选项,但我现在找不到。它可能是 M Developer Preview 版本中存在的东西,并在最终的 6.0 版本中被删除。

      【讨论】:

      • 我使用模拟器 - 没有任何效果。请问可以用模拟器测试吗?
      • @WindRider:这两种方法都适用于 Android 6.0 模拟器上的示例应用程序。
      • 问题出在我的代码中。我使用的是权限组而不是权限。这导致系统无论如何都会立即返回 PERMISSION_DENIED。
      • @WindRider:是的,你不是第一个这样做的人,也许你也不会是最后一个。如果对于无法识别的权限名称或其他内容有单独的返回码 (PERMISSION_WTF),那就太好了。
      • 从逻辑上讲,现在在 M 中,它们为整个权限组存储一个标志,而不是每个细粒度权限一个标志。所以我做了一个错误的假设,我可以毫无问题地在任何地方使用权限组。
      【解决方案6】:

      找到了:

      系统设置 > 应用 > 重置应用偏好(在菜单中)

      【讨论】:

      • 用模拟器测试过,这根本行不通。我敢打赌,您在执行此操作之前手动更改了权限。
      猜你喜欢
      • 2017-03-31
      • 2017-02-12
      • 2020-05-29
      • 2018-01-03
      • 2018-06-26
      • 1970-01-01
      • 2016-03-19
      • 2015-12-27
      • 2017-04-20
      相关资源
      最近更新 更多