来自清单的权限在Android 6中不起作用


67

它完全忽略:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

所以我有例外:

原因:android.view.WindowManager $ BadTokenException:无法添加窗口android.view.ViewRootImpl$W@86fb55b-拒绝此窗口类型的权限

甚至没有列出:

在此处输入图片说明

我该如何解决?谢谢。

编辑:

它在“配置应用程序” /“高级” /“在其他应用程序上绘制”中列出。所以我打开它,现在它可以正常工作,但是为什么当我运行我的应用程序时,没有对话框询问许可?所有的权限都被默认关闭,我需要进行设置并手动将其打开?


1
我也有这个问题。我还尝试通过调用来获得SYSTEM_ALERT_WINDOW的许可Activity#requestPermissions(),但这不起作用。
Shigerello,2015年

2
我在这里提出了一个错误报告:code.google.com/p/android-developer-preview/issues/…– 2015
标记

9
顺便说一句,该权限在顶部栏中的设置->应用程序->齿轮图标->在其他应用程序上绘制(在“高级”部分下)下列出。非常非常隐藏!
ChristianGarcía2015年

Answers:


127

感谢CommonsWare的博客文章,我有了一些线索。

假设您的代码在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);
    }
}

然后,重新检查权限以获得更好的UX:

@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 这是正常的吗?
Djordje Tankosic 2015年

好吧...我不确定。正如CommonsWare在其博客文章中提到的那样,很少(或没有)有关SYSTEM_ALERT_WINDOW的更改的文档。可以有一种更简单的方法,例如使用一个小对话框询问权限,但是目前,我只知道这种方法。
Shigerello

您的解决方案对我有用。但在Android文档中提供的常规方式没有工作(developer.android.com/training/permissions/requesting.html
Noundla桑迪普

4
是的,但是此权限已被破坏。如果用户在设置中禁用此权限并且正在运行某些服务(需要此权限),将会发生什么?在这种情况下,由于没有上下文,因此无法通知服务关闭自身,所以我所能做的就是捕获异常。
Djordje Tankosic 2015年

1
通过Android服务调用一些叠加图时如何添加此权限范例:ChatHead Draw
Elshan
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.