【问题标题】:Android System Overlay window not workingAndroid系统覆盖窗口不起作用
【发布时间】:2017-11-06 18:35:44
【问题描述】:

我正在构建 Android 应用程序,并尝试在此过程中尽我所能学习。作为测试,我想在系统中添加“聊天头”样式覆盖。所以,我环顾四周,发现了一些很好的教程,以及一些非常好的答案,但它仍然无法正常工作。在我的 android 清单中,我有使用权限声明..

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

然后在我的 Preference 页面中,当用户单击 SwitchPreference 以激活弹出聊天窗口时,我正在检查版本和权限,如下所示...

private Preference.OnPreferenceChangeListener chatHeadsChangeListener = new Preference.OnPreferenceChangeListener() {
        @Override
        public boolean onPreferenceChange(Preference preference, Object o) {
            if((boolean) o) {
                if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M &&
                    !Settings.canDrawOverlays(getApplicationContext())) {
                    Intent intent = new Intent(
                            Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                            Uri.parse("package:" + getPackageName())
                    );
                    startActivityForResult(intent, CODE_DRAW_OVER_OTHER_APP_PERMISSION);
                } else {
                    initializeChatHeadsView();
                }
            }
            return true;
        }
    };

然后在我的 onActivityResult 中,我再次检查以确保,就像我在这里找到的一个答案...

@Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        super.onActivityResult(requestCode, resultCode, data);
        if(requestCode == CODE_DRAW_OVER_OTHER_APP_PERMISSION) {
            if(Settings.canDrawOverlays(this)) {
                initializeChatHeadsView();
            } else {
                Toast.makeText(
                        this,
                        "Draw over other app permission was not available. Cannot activate Popup Chat",
                        Toast.LENGTH_LONG
                ).show();
            }
        }
    }

第一次在运行 Android 8.0 的模拟器上加载应用程序时,我进入设置页面并单击 SwitchPreference 将其打开。设置页面打开询问我是否要启用权限,我激活了权限,但激活后它不会返回我的应用程序,所以我点击返回按钮返回我的应用程序,然后我得到“[应用程序] 已停止响应。”如果我检查 AndroidStudio 中的日志,我会收到错误消息...

Process: test.notreal.justatext, PID: 21429
                  java.lang.RuntimeException: Unable to create service test.notreal.justatext.service.FloatingViewService: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@bc855eb -- permission denied for window type 2002

所以它仍然说权限被拒绝,即使我启用了权限,并且在我的 onActivityResult 我正在检查 if(Settings.canDrawOverlays())

谁能明白为什么会失败?我想不通。感谢您的帮助,我真的很感激。

【问题讨论】:

    标签: java android android-permissions


    【解决方案1】:

    适用于面向 Android 8.0 的应用

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

    因此对于 Android 8.0,您必须请求此权限,以获取较低版本

    SYSTEM_ALERT_WINDOW 权限

    会起作用

    更多请参考此链接

    https://developer.android.com/about/versions/oreo/android-8.0-changes.html#cwt

    【讨论】:

    • 谢谢,我很感激。那么,您知道是否有办法让该应用程序同时在 8.0 之前和 8.0 之后的设备上运行?如果我将权限更改为 TYPE_APPLICATION_OVERLAY,那么任何运行低于 8.0 的设备都将无法工作。将这两个权限都添加到清单中是否安全?
    猜你喜欢
    • 2015-12-15
    • 1970-01-01
    • 1970-01-01
    • 2018-11-09
    • 1970-01-01
    • 2015-04-30
    • 2013-01-19
    • 1970-01-01
    • 2022-01-06
    相关资源
    最近更新 更多