【问题标题】:DRAW OVERLAY doesnt work although permission SYSTEM_ALERT_WINDOW is granted尽管授予了 SYSTEM_ALERT_WINDOW 权限,但 DRAW OVERLAY 不起作用
【发布时间】:2019-01-07 19:42:23
【问题描述】:

这让我发疯......因为我的智能手机有 API > 23 我的 youtube 覆盖不再工作......所以我实现了所有必要的东西。 现在,我的应用程序请求绘制叠加层的权限(SYSTEM_ALERT_WINDOW),如果我调试我的应用程序,那么我看到该权限已被授予。但是,如果我启动覆盖,我会收到此错误消息:

AndroidRuntime: 致命异常: main java.lang.RuntimeException: 无法创建服务...: android.view.WindowManager$BadTokenException: 无法添加窗口 android.view.ViewRootImpl$W@479d57e -- 窗口权限被拒绝 键入 2002

Manifest 中的权限如下:

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

我请求许可:

Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName()));
startActivityForResult(intent, MainActivity.PERMISSIONS_REQUEST_SYSTEM_ALERT_WINDOW);

我这样检查权限:

if (Settings.canDrawOverlays(this)) {
   permissionShowYoutubeOverlayIsOK = true;
}

那么,这到底是怎么回事??

感谢任何帮助!!!

再见 菲尔

【问题讨论】:

  • 如果我没记错的话,这个选项应该专门由用户手动授予。

标签: android permissions


【解决方案1】:

根据针对 Android 8.0 的应用的 Android 8.0 行为更改文档:

使用 SYSTEM_ALERT_WINDOW 权限的应用不能再使用以下窗口类型在其他应用和系统窗口上方显示警报窗口:

TYPE_PHONE, TYPE_PRIORITY_PHONE, TYPE_SYSTEM_ALERT, TYPE_SYSTEM_OVERLAY, TYPE_SYSTEM_ERROR

相反,应用必须使用一种名为 TYPE_APPLICATION_OVERLAY 的新窗口类型

所以你必须降低 TargetSDK 或使用更新的 TYPE_xxxxx

【讨论】:

    【解决方案2】:

    谢谢!这真的有帮助:) 但还有更多步骤要做:

    1. 按照您的描述更改为 TYPE_APPLICATION_OVERLAY

    2. 添加权限:

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

    见: Permission Denial: startForeground requires android.permission.FOREGROUND_SERVICE

    1. 需要新的通知渠道

      见:startForeground fail after upgrade to Android 8.1

    现在它终于可以正常运行了 :) 谢谢!!

    【讨论】:

      猜你喜欢
      • 2017-09-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-04
      • 1970-01-01
      • 2020-01-01
      • 1970-01-01
      相关资源
      最近更新 更多