如何忘记 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 运行时权限中的“不再询问”复选框?