【问题标题】:Draw over other apps not working on android 8.0绘制无法在 android 8.0 上运行的其他应用程序
【发布时间】:2017-11-26 18:28:45
【问题描述】:

我有一个应用程序,它有一个小部件,允许聊天作为浮动小部件使用,有点像 FB。它可以在较低版本的 Android 上完美运行,但由于某种原因,它无法在 Android 8.0 上运行。我已通读权限更改,并在我的 AndroidManifest.xml 文件中声明了这两个权限...

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

然后在我的活动中,我正在检查权限,如果被授予,它将尝试添加新视图...

if(Settings.canDrawOverlays(this)) {
    initializeChatHeadsView();
}

initializeChatHeadsView,只是将布局添加到窗口。我已经启用了权限,如果我进入设备上的设置,我什至可以看到它已启用,我可以在“显示在其他应用程序”权限页面中看到我的应用程序,所以它确实有权限,但每次我尝试添加应用程序崩溃的视图并收到消息...

无法添加窗口 android.view.ViewRootImpl$W@f6948a0 -- 权限 拒绝窗口类型 2002

我不明白为什么它不起作用。清单具有旧版本和新版本的权限,系统专门检查“canDrawOverlays”,它在我拥有的每个模拟器上都运行良好,除了运行 Android 8.0 的模拟器。

如果需要,我很乐意展示更多代码。任何帮助将不胜感激。谢谢。

【问题讨论】:

    标签: java android permissions overlay


    【解决方案1】:

    我发现了问题。如果其他人在使用 android 8.0 中的其他应用程序时遇到问题,我必须改变构建窗口的方式....

    int layoutType;
    if(Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
      layoutType = WindowManager.LayoutParams.TYPE_PHONE;
    } else {
      layoutType = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
    }
    
    params = new WindowManager.LayoutParams(
      WindowManager.LayoutParams.WRAP_CONTENT,
      WindowManager.LayoutParams.WRAP_CONTENT,
      layoutType,
      WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE,
      PixelFormat.TRANSLUCENT
    );
    

    现在它可以完美运行了。

    【讨论】:

    • 您需要在 if 条件下与 Oreo (Build.VERSION_CODES.O) 进行比较,因为字段 TYPE_APPLICATION_OVERLAY 需要 API 级别 26。无论如何,这很有帮助,谢谢!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-18
    • 2013-08-30
    相关资源
    最近更新 更多