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

Posted

技术标签:

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

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

【问题讨论】:

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

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

    进入应用权限 启用和禁用所有权限

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

您可以在此视频中查看 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 回答了完整的实现。

【讨论】:

@me_ android 的缺陷总是让我们惊叹不已。看起来这是一个特定于设备的问题。或者它是否发生在所有设备中?顺便说一句,我的图书馆可能会对你有所帮助。试试这个:github.com/nabinbhandari/Android-Permissions 我提出了通用解决方案...***.com/questions/37130838/…【参考方案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】:

找到了:

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

【讨论】:

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

以上是关于如何忘记 Android M 运行时权限对话框中的“不再询问”选项的主要内容,如果未能解决你的问题,请参考以下文章

Android M 权限对话框未显示

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

如何在 Android M 或更高版本中在运行时更改权限时防止重新创建 Activity

Android运行时权限对话框未显示

如何在 Android 中自定义权限对话框?

Android M新的运行时权限开发者需要知道的一切