如何在Android M运行时权限对话框中取消“不再询问”的选项?

8

enter image description here

我想知道“不再询问”复选框的布尔标志存储在哪里以及如何清除其值?不一定需要通过编程方式,可以通过设置、命令或某些工具手动清除。尝试清除应用数据、卸载、卸载和清除两者都尝试过,尝试手动来回切换权限,甚至尝试为模拟器设置一个更新的Marshmallow映像,但没有成功!

1
我相信如果你进入设置,然后选择应用程序并选择你的应用程序,它应该会在某个地方出现。 - Johan
1
是的,没错,我刚刚偶然发现了“重置应用程序首选项”选项。之前不知道这个功能。 - WindRider
不行啊,这个也不行!:( 删除我的回答! - WindRider
发现问题了,是我的代码有问题。我使用的是权限组而不是权限。已经修复好了 :) - WindRider
6个回答

9

清除数据(设置 > 应用程序 > 您的应用程序 > 存储 > 清除数据)和卸载应用程序都清除了此标志的状态,以及清除与该应用程序相关的其他所有运行时权限。

这种行为在运行Android 6.0的Nexus 5上通过此示例应用进行了测试。

我记得在某个地方看到过手动选项,但现在找不到了。可能是存在于M Developer Preview版本中并被删除了,在最终的6.0版本中不存在。


我使用模拟器 - 什么都不起作用。你能在模拟器上测试一下吗? - WindRider
@WindRider:在Android 6.0模拟器上,这两种方法都可以很好地处理该示例应用程序。 - CommonsWare
问题出在我的代码上。我使用了权限组而不是权限,这导致系统每次都立即返回 PERMISSION_DENIED,无论如何。 - WindRider
1
@WindRider:是啊,你不是第一个这样做的人,也许你也不会是最后一个。如果有一种专门用于未识别权限名称的返回代码(PERMISSION_WTF)之类的东西就好了。 - CommonsWare
从逻辑上讲,现在在M中,他们为整个权限组存储一个标志,而不是每个细粒度权限都有一个标志。因此,我错误地假设可以在任何地方使用权限组而没有问题。 - WindRider
显示剩余3条评论

7
您可以通过在应用程序设置中清除数据来“忘记”它。
编辑: 正如@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:我已经在这个回答中全面解释了实现。


@me_ Android总是让我们惊叹于其缺陷。看起来这是一个设备特定的问题。或者它在所有设备上都会发生吗?顺便说一下,我的库可能对你有所帮助。试试这个:https://github.com/nabinbhandari/Android-Permissions - Nabin Bhandari
我提供了通用的解决方案... https://dev59.com/Xpbfa4cB1Zd3GeqP0Oac#37131623 - me_

3

找到它了:

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

enter image description here


1
经过模拟器测试,这根本不起作用。我敢打赌,在你执行此操作之前,你手动更改了权限。 - me_

2
我唯一行得通的解决方法是:
  1. 进入应用程序权限
  2. 启用和禁用所有权限

这样就会忘记“不再询问”的选择。

App permissions list

你可以在这个视频中查看它https://www.youtube.com/watch?v=F8hQfmYTEaQ

所以,正如我在发布测试此页面提供的所有其他解决方案的视频时所说的那样,一年半之前你... - me_
1
我通常不喜欢为了一张图片的信息而浏览整个视频。 - Dawit Abraham

1
@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())));
        }
    }
}

0

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

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

我尝试了此页面上提供的所有建议,但都没有起作用。手动启用和禁用仍然会弹出对话框。

点击上面的YouTube帖子以验证这是正确的答案。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接