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

Djo*_*sic 67 android android-6.0-marshmallow

它完全忽略了:

<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
Run Code Online (Sandbox Code Playgroud)

所以我得到了例外:

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

它甚至没有列出:

在此输入图像描述

我该如何解决?谢谢.

编辑:

它列在配置应用程序/高级/绘制其他应用程序中.所以我打开它现在它工作正常,但为什么在我运行我的应用程序时没有任何对话框询问权限?所有的perrmissions被deafult关闭,我需要去设置并mannualy打开它?

Shi*_*llo 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

然后,重新检查权限以获得更好的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...
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 是的,但这个许可被打破了.如果用户在设置中禁用此权限,并且某些服务(需要此权限)正在运行,会发生什么?在这种情况下,不可能通知服务自行关闭,因为没有上下文,所以我所能做的就是捕获异常. (4认同)