Android 如何修复服务中不存在的WindowManagerBadtokenexException';你没有活动机器人吗?
我已经创建了一个aosp,在服务中,它有窗口管理器。我已在清单中声明了窗口管理器权限,但仍然出现无法添加窗口的错误Android 如何修复服务中不存在的WindowManagerBadtokenexException';你没有活动机器人吗?,android,service,broadcastreceiver,android-source,android-windowmanager,Android,Service,Broadcastreceiver,Android Source,Android Windowmanager,我已经创建了一个aosp,在服务中,它有窗口管理器。我已在清单中声明了窗口管理器权限,但仍然出现无法添加窗口的错误 public class BannerService extends Service { private WindowManager mWinManager; private WindowManager.LayoutParams mUpperBannerParams; private WindowManager.LayoutParams mExpandSysMsgLayoutPar
public class BannerService extends Service {
private WindowManager mWinManager;
private WindowManager.LayoutParams mUpperBannerParams;
private WindowManager.LayoutParams mExpandSysMsgLayoutParam;
private WindowManager.LayoutParams mExpandLayoutParam;
@Override
public void onCreate() {
super.onCreate();
Log.d(TAG, "onCreate");
mWinManager = (WindowManager) this.getSystemService(Context.WINDOW_SERVICE);
mUpperBannerParams = new WindowManager.LayoutParams(
WindowManager.LayoutParams.TYPE_SYSTEM_ERROR);
mUpperBannerParams.width = WindowManager.LayoutParams.MATCH_PARENT;
mUpperBannerParams.height = WindowManager.LayoutParams.WRAP_CONTENT;
mUpperBannerParams.flags = WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE |
WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
mUpperBannerParams.format = PixelFormat.TRANSLUCENT;
mUpperBannerParams.gravity = Gravity.TOP | Gravity.FILL_HORIZONTAL;
View bannerBackView = layout_inflater.inflate(R.layout.dummy_banner_background, null);
mExpandBannerWindowContainer = new FrameLayout(this) {
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
cancelResetExpandBanner(); // fail-safe:
return super.dispatchTouchEvent(ev);
}
};
mWinManager.addView(mExpandBannerWindowContainer, mUpperBannerParams); //getting error at 813th line is this because windowmanager in 9.
}
}
我甚至还加了一句
但我得到的错误是
12-13 05:28:55.218 1125 1125 E AndroidRuntime: java.lang.RuntimeException: Unable to create service jp.advop.banner.application.BannerService: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@36c0149 -- permission denied for window type 2010
12-13 05:28:55.218 1125 1125 E AndroidRuntime: at android.app.ActivityThread.handleCreateService(ActivityThread.java:3582)
12-13 05:28:55.218 1125 1125 E AndroidRuntime: at android.app.ActivityThread.access$1300(ActivityThread.java:200)
12-13 05:28:55.218 1125 1125 E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1672)
12-13 05:28:55.218 1125 1125 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:106)
12-13 05:28:55.218 1125 1125 E AndroidRuntime: at android.os.Looper.loop(Looper.java:193)
12-13 05:28:55.218 1125 1125 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:6718)
12-13 05:28:55.218 1125 1125 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method)
12-13 05:28:55.218 1125 1125 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
12-13 05:28:55.218 1125 1125 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:917)
12-13 05:28:55.218 1125 1125 E AndroidRuntime: Caused by: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@36c0149 -- permission denied for window type 2010
12-13 05:28:55.218 1125 1125 E AndroidRuntime: at android.view.ViewRootImpl.setView(ViewRootImpl.java:822)
12-13 05:28:55.218 1125 1125 E AndroidRuntime: at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:356)
12-13 05:28:55.218 1125 1125 E AndroidRuntime: at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93)
12-13 05:28:55.218 1125 1125 E AndroidRuntime: at jp.advop.banner.application.BannerService.onCreate(BannerService.java:813)
12-13 05:28:55.218 1125 1125 E AndroidRuntime: at android.app.ActivityThread.handleCreateService(ActivityThread.java:3570)
我甚至还使用了前台服务
public class ServiceBootReceiver extends BroadcastReceiver {
@Override
public void onReceive(Context context, Intent intent) {
intent.setClass(context, BannerService.class);
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.P) {
context.startForegroundService(intent);
} else {
context.startService(intent);
}
}
}
从Android 8开始,使用
SYSTEM\u ALERT\u窗口
权限的应用程序将不再使用TYPE\u SYSTEM\u ERROR
窗口类型在其他应用程序和系统窗口上方显示警报窗口
相反,请使用名为的新窗口类型
参考资料:从Android 8开始,使用
系统警报窗口
权限的应用程序不能再使用类型系统错误
窗口类型在其他应用程序和系统窗口上方显示警报窗口
相反,请使用名为的新窗口类型
参考资料:您在哪个Android版本上测试此功能?Android 9。在6中,它起作用了。我正在将6横幅服务迁移到android 9。当我在9中运行时,它抛出错误。你在哪个Android版本上测试这个?Android 9。在6中,它起作用了。我正在将6横幅服务迁移到android 9。当我在9中运行时,它会抛出错误。因此,我需要使用类型应用程序覆盖,而不是WindowManager.LayoutParams.TYPE\u SYSTEM\u错误?我仍然会收到相同的错误。原因:android.view.WindowManager$BadTokenException:无法添加窗口android.view.ViewRootImpl$W@913479c--窗口类型2010的权限被拒绝您是否在清单中声明了
系统警报\u窗口
权限?是,我声明了权限。是否需要使用drawOverlay?但我没有要使用的活动。因此,我需要使用类型应用程序覆盖,而不是WindowManager.LayoutParams.TYPE\u SYSTEM\u ERROR?我仍然收到相同的错误。原因:android.view.WindowManager$BadTokenException:无法添加窗口android.view.ViewRootImpl$W@913479c--窗口类型2010的权限被拒绝您是否在清单中声明了系统警报\u窗口
权限?是,我声明了权限。是否需要使用drawOverlay?但是我没有活动可以使用。