清单文件中的权限在安卓6上不起作用。

67
它完全忽略了:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

我遇到了异常:

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

甚至没有列出来:

enter image description here

我该如何修复?谢谢。

编辑:

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


1
我也遇到了这个问题。我也尝试通过调用“Activity#requestPermissions()”来获取SYSTEM_ALERT_WINDOW的权限,但是这并没有起作用。 - Shigerello
2
我在这里提交了一个错误报告:https://code.google.com/p/android-developer-preview/issues/detail?id=2971 - Mark
9
顺便说一下,许可权限在“设置”→“应用程序”→顶部工具栏中的“齿轮图标”下方列出,“高级”选项中的“允许在其他应用程序上绘制”中。非常非常隐蔽! - Christian García
1个回答

127
感谢CommonsWare的博客文章,我有了一些线索。
假设您的代码在ActivityFragment中,请检查覆盖权限,如有必要,请请求权限:
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...
        }
    }
}

谢谢!它可以工作,但是当我请求权限时,它不会显示正常(小)对话框,而是显示全屏对话框,您可以在这里看到:http://imgur.com/eWf5DSC 这正常吗? - Djordje Tankosic
嗯...我不确定。正如CommonsWare在其博客文章中提到的那样,关于SYSTEM_ALERT_WINDOW的更改几乎没有(或根本没有)文档记录。可能存在一种更简单的方法,比如用一个小对话框来询问权限,但目前这是我所知道的唯一方法。 - Shigerello
你的解决方案对我有效。但是在Android文档中提供的常规方法并没有起作用(http://developer.android.com/training/permissions/requesting.html)。 - Noundla Sandeep
4
是的,但是这个权限已经失效了。如果用户在设置中禁用了此权限,并且某些需要此权限的服务正在运行,会发生什么情况?在这种情况下,无法通知服务关闭自身,因为没有上下文,所以我能做的就是捕获异常。 - Djordje Tankosic
1
如何在通过Android服务调用某些覆盖层绘图时添加此权限? 例如:ChatHead Draw - Elshan
显示剩余5条评论

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