清单的权限在 Android 6 中不起作用
Posted
技术标签:
【中文标题】清单的权限在 Android 6 中不起作用【英文标题】:Permission from manifest doesn't work in Android 6 【发布时间】:2015-11-10 18:31:11 【问题描述】:它完全忽略:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
所以我得到了例外:
原因:android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@86fb55b -- 该窗口类型的权限被拒绝
它甚至没有列出:
我应该如何解决它?谢谢。
编辑:
它在配置应用程序/高级/绘制其他应用程序中列出。所以我打开它,现在它工作正常,但是为什么在我运行我的应用程序时没有任何对话框询问权限?所有权限都被默认关闭了,我需要去设置并手动打开它吗?
【问题讨论】:
我也遇到了这个问题。我也尝试通过调用Activity#requestPermissions()
来获得SYSTEM_ALERT_WINDOW 的权限,但这不起作用。
我在这里提出了一个错误报告:code.google.com/p/android-developer-preview/issues/…
顺便说一句,权限列在设置 -> 应用程序 -> 顶部栏中的齿轮图标 -> 绘制在其他应用程序上(在高级部分下)。非常非常隐蔽!
Unable to add window android.view.ViewRoot$W@44da9bc0 -- permission denied for this window type的可能重复
【参考方案1】:
感谢CommonsWare's blog post,我得到了一些线索。
假设您的代码在Activity
或Fragment
中,请检查覆盖权限并在必要时提出请求:
public static int OVERLAY_PERMISSION_REQ_CODE = 1234;
public void someMethod()
if (!Settings.canDrawOverlays(this))
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, OVERLAY_PERMISSION_REQ_CODE);
然后,重新检查权限以获得更好的用户体验:
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data)
if (requestCode == OVERLAY_PERMISSION_REQ_CODE)
if (!Settings.canDrawOverlays(this))
// SYSTEM_ALERT_WINDOW permission not granted...
【讨论】:
谢谢!它可以工作,但它不显示正常(小)对话框,当我请求权限时它显示全屏对话框,你可以在这里看到:imgur.com/eWf5DSC 这是正常的吗? 嗯……我不确定。正如 CommonsWare 在其博客文章中提到的那样,关于 SYSTEM_ALERT_WINDOW 更改的文档很少(或没有)。可以有一种更简单的方法,例如通过一个小对话框询问权限,但目前,我知道这种方法是唯一的。 您的解决方案适合我。但是 android 文档中提供的常规方式不起作用(developer.android.com/training/permissions/requesting.html) 是的,但是这个权限被破坏了。如果用户在设置中禁用此权限,并且某些服务(需要此权限)正在运行,会发生什么?在这种情况下,无法通知服务自行关闭,因为没有上下文,所以我所能做的就是捕获异常。 在通过Android Service 调用一些覆盖绘制时如何添加此权限? 示例:ChatHead Draw以上是关于清单的权限在 Android 6 中不起作用的主要内容,如果未能解决你的问题,请参考以下文章
navigator.permissions.query 在 android/ios webview 中不起作用
为什么新的Firebase Crashlytics(没有Fabric)在Android中不起作用?