Android Studio报错:android.view.WindowManagerBadTokenException: Unable to add window android.view.View

做一个悬浮窗口,报错:

java.lang.RuntimeException: 
Unable to create service com.spacesoftwares.floatingwindowdemo.MainService: 
android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@

引起崩溃的代码大致是:

indowManager.LayoutParams params = new WindowManager.LayoutParams();
params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
。。。。
private WindowManager windowManager;
windowManager.addView(FloatingLayout, params);

搜了一下,发现是Android版本引起的,

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

针对 Android 8.0 的应用
这些行为变更专门应用于针对 O 平台或更高平台版本的应用。针对 Android 8.0 或更高平台版本进行编译,或将 targetSdkVersion 设为 Android 8.0 或更高版本的应用开发者必须修改其应用以正确支持这些行为(如果适用)。

提醒窗口
使用 SYSTEM_ALERT_WINDOW 权限的应用无法再使用以下窗口类型来在其他应用和系统窗口上方显示提醒窗口:

TYPE_PHONE
TYPE_PRIORITY_PHONE
TYPE_SYSTEM_ALERT
TYPE_SYSTEM_OVERLAY
TYPE_SYSTEM_ERROR
相反,应用必须使用名为 TYPE_APPLICATION_OVERLAY 的新窗口类型。

使用 TYPE_APPLICATION_OVERLAY 窗口类型显示应用的提醒窗口时,请记住新窗口类型的以下特性:

应用的提醒窗口始终显示在状态栏和输入法等关键系统窗口的下面。
系统可以移动使用 TYPE_APPLICATION_OVERLAY 窗口类型的窗口或调整其大小,以改善屏幕显示效果。
通过打开通知栏,用户可以访问设置来阻止应用显示使用 TYPE_APPLICATION_OVERLAY 窗口类型显示的提醒窗口。
内容变更通知
Android 8.0 更改了 ContentResolver.notifyChange() 和 registerContentObserver(Uri, boolean, ContentObserver) 在针对 Android 8.0 的应用中的行为方式。

现在,这些 API 需要在所有 URI 中为颁发机构定义一个有效的 ContentProvider。使用相关权限定义一个有效的 ContentProvider 可帮助您的应用防范来自恶意应用的内容变更,并防止将可能的私密数据泄露给恶意应用。

视图焦点
可点击的 View 对象现在默认也可以成为焦点。如果您希望 View 对象可点击但不可成为焦点,请在包含 View 的布局 XML 文件中将 android:focusable 属性设置为 false,或者将 false 传递至应用界面逻辑中的 setFocusable()。

大致意思是,在构造悬浮窗时,应该使用

WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;

而不是

WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;

这里也找到一个类似的解释,

https://blog.csdn.net/xiangzaixiansheng/article/details/78830248

猜你喜欢

转载自blog.csdn.net/tanmx219/article/details/81272919