android.view.WindowManager addView 抛InvalidDisplayException

在实现Android悬浮窗功能时,调用WindowManager的addView方法遇到InvalidDisplayException异常,错误信息为:'Unable to add window — the specified window type is not valid'。解决方法是在调用windowManager.addView之前正确设置LayoutParams的类型。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

android.view.WindowManager$InvalidDisplayException: Unable to add window android.view.ViewRootImpl$W@15682835 -- the specified window type is not valid

在做悬浮框时使用了WindowManager 调用其addView()时抛出以上异常。

解决:

         1.在调用windowManager.addView(this, params)之前设置params的类型

     params.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
   2.在AndroidManifest.xml中添加权限:
     <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

07-20 19:57:40.672 5131 5131 D AndroidRuntime: Shutting down VM --------- beginning of crash 07-20 19:57:40.673 5131 5131 E AndroidRuntime: FATAL EXCEPTION: main 07-20 19:57:40.673 5131 5131 E AndroidRuntime: Process: com.adayo.aaop_deviceservice, PID: 5131 07-20 19:57:40.673 5131 5131 E AndroidRuntime: java.lang.RuntimeException: Unable to create service com.adayo.aaop_deviceservice.service.BurialPointService: android.view.WindowManager$InvalidDisplayException: Unable to add window android.view.ViewRootImpl$W@e6477e5 -- the specified display can not be found 07-20 19:57:40.673 5131 5131 E AndroidRuntime: at android.app.ActivityThread.handleCreateService(ActivityThread.java:4221) 07-20 19:57:40.673 5131 5131 E AndroidRuntime: at android.app.ActivityThread.access$1600(ActivityThread.java:238) 07-20 19:57:40.673 5131 5131 E AndroidRuntime: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1955) 07-20 19:57:40.673 5131 5131 E AndroidRuntime: at android.os.Handler.dispatchMessage(Handler.java:106) 07-20 19:57:40.673 5131 5131 E AndroidRuntime: at android.os.Looper.loop(Looper.java:223) 07-20 19:57:40.673 5131 5131 E AndroidRuntime: at android.app.ActivityThread.main(ActivityThread.java:7731) 07-20 19:57:40.673 5131 5131 E AndroidRuntime: at java.lang.reflect.Method.invoke(Native Method) 07-20 19:57:40.673 5131 5131 E AndroidRuntime: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 07-20 19:57:40.673 5131 5131 E AndroidRuntime: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) 07-20 19:57:40.673 5131 5131 E AndroidRuntime: Caused by: android.view.WindowManager$InvalidDisplayException: Unable to add window android.view.ViewRootImpl$W@e6477e5 -- the specified display can not be found 07-20 19:57:40.673 5131 5131 E AndroidRuntime: at android.view.ViewRootImpl.setView(ViewRootImpl.java:1099) 07-20 19:57:40.673 5131 5131 E AndroidRuntime: at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:409) 07-20 19:57:40.673 5131 5131 E AndroidRuntime: at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:109) 07-20 19:57:40.673 5131 5131 E AndroidRuntime: at android.app.Dialog.show(Dialog.java:342) 07-20 19:57:40.673 5131 5131 E AndroidRuntime: at android.app.Presentation.show(Presentation.java:257) 07-20 19:57:40.673 5131 5131 E AndroidRuntime: at com.adayo.aaop_deviceservice.service.BurialPointService.x(Unknown Source:77) 07-20 19:57:40.673 5131 5131 E AndroidRuntime: at com.adayo.aaop_deviceservice.service.BurialPointService.A(Unknown Source:50) 07-20 19:57:40.673 5131 5131 E AndroidRuntime: at com.adayo.aaop_deviceservice.service.BurialPointService.onCreate(Unknown Source:10) 07-20 19:57:40.673 5131 5131 E AndroidRuntime: at android.app.ActivityThread.handleCreateService(ActivityThread.java:4209) 07-20 19:57:40.673 5131 5131 E AndroidRuntime: ... 8 more 07-20 19:57:40.676 5131 5131 I Process : Sending signal. PID: 5131 SIG: 9 private void createBackgroundToQnx() { DisplayManager displayManager = (DisplayManager)this.getSystemService(Context.DISPLAY_SERVICE); Display[] displays = displayManager.getDisplays(); Log.i(TAG, "createBackgroundToQnx displays = " + Arrays.toString(displays)); for (Display display : displayManager.getDisplays()) { if (display.getDisplayId() == 1) { Presentation presentation = new Presentation(this, displayManager.getDisplay(1)); View view = new View(this); view.setBackgroundColor(Color.BLACK); presentation.setContentView(view); presentation.show(); } } }
08-07
我的是系统级服务,然后接了主屏和仪表屏也报这个错误,延迟初始化也没用android.view.WindowManager$InvalidDisplayException: Unable to add window android.view.ViewRootImpl$W@81df4e9 -- the specified display can not be found 07-20 19:57:33.600 2235 2235 I BurialPointService1: at android.view.ViewRootImpl.setView(ViewRootImpl.java:1099) 07-20 19:57:33.600 2235 2235 I BurialPointService1: at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:409) 07-20 19:57:33.600 2235 2235 I BurialPointService1: at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:109) 07-20 19:57:33.600 2235 2235 I BurialPointService1: at android.app.Dialog.show(Dialog.java:342) 07-20 19:57:33.600 2235 2235 I BurialPointService1: at android.app.Presentation.show(Presentation.java:257) 07-20 19:57:33.600 2235 2235 I BurialPointService1: at com.adayo.aaop_deviceservice.service.BurialPointService.x(Unknown Source:109) 07-20 19:57:33.600 2235 2235 I BurialPointService1: at com.adayo.aaop_deviceservice.service.BurialPointService.A(Unknown Source:50) 07-20 19:57:33.600 2235 2235 I BurialPointService1: at com.adayo.aaop_deviceservice.service.BurialPointService.onCreate(Unknown Source:10) 07-20 19:57:33.600 2235 2235 I BurialPointService1: at android.app.ActivityThread.handleCreateService(ActivityThread.java:4209) 07-20 19:57:33.600 2235 2235 I BurialPointService1: at android.app.ActivityThread.access$1600(ActivityThread.java:238) 07-20 19:57:33.600 2235 2235 I BurialPointService1: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1955) 07-20 19:57:33.600 2235 2235 I BurialPointService1: at android.os.Handler.dispatchMessage(Handler.java:106) 07-20 19:57:33.600 2235 2235 I BurialPointService1: at android.os.Looper.loop(Looper.java:223) 07-20 19:57:33.600 2235 2235 I BurialPointService1: at android.app.ActivityThread.main(ActivityThread.java:7731) 07-20 19:57:33.600 2235 2235 I BurialPointService1: at java.lang.reflect.Method.invoke(Native Method) 07-20 19:57:33.600 2235 2235 I BurialPointService1: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 07-20 19:57:33.600 2235 2235 I BurialPointService1: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) private void createBackgroundToQnx() { DisplayManager displayManager = (DisplayManager)this.getSystemService(Context.DISPLAY_SERVICE); Display[] displays = displayManager.getDisplays(); Log.i(TAG, "createBackgroundToQnx displays = " + Arrays.toString(displays)); for (Display display : displayManager.getDisplays()) { if (display.getDisplayId() != Display.DEFAULT_DISPLAY) { if (!display.isValid()) { Log.i(TAG, "createBackgroundToQnx display is invalid ! displayID = " + display.getDisplayId()); continue; } try { Presentation presentation = new Presentation(getApplicationContext(), display); View view = new View(this); view.setBackgroundColor(Color.BLACK); presentation.setContentView(view); presentation.show(); } catch (WindowManager.InvalidDisplayException e) { Log.i(TAG, "Failed to show presentation on display: " + display, e); } } } }
08-07
07-20 19:57:33.402 2248 2248 I BurialPointService1: Failed to show presentation on display: Display id 1: DisplayInfo{"内置屏幕", displayId 1, FLAG_SECURE, FLAG_SUPPORTS_PROTECTED_BUFFERS, FLAG_TRUSTED, real 1920 x 720, largest app 1920 x 1920, smallest app 720 x 720, appVsyncOff 1000000, presDeadline 16666666, mode 2, defaultMode 2, modes [{id=2, width=1920, height=720, fps=60.000004}], hdrCapabilities HdrCapabilities{mSupportedHdrTypes=[], mMaxLuminance=500.0, mMaxAverageLuminance=500.0, mMinLuminance=0.0}, minimalPostProcessingSupported false, rotation 0, state ON, type INTERNAL, uniqueId "local:130", app 1920 x 720, density 160 (167.013 x 167.779) dpi, layerStack 1, colorMode 0, supportedColorModes [0], address {port=130}, deviceProductInfo null, removeMode 0}, DisplayMetrics{density=1.0, width=1920, height=720, scaledDensity=1.0, xdpi=167.013, ydpi=167.779}, isValid=true 07-20 19:57:33.402 2248 2248 I BurialPointService1: android.view.WindowManager$InvalidDisplayException: Unable to add window android.view.ViewRootImpl$W@a379ee3 -- the specified display can not be found 07-20 19:57:33.402 2248 2248 I BurialPointService1: at android.view.ViewRootImpl.setView(ViewRootImpl.java:1099) 07-20 19:57:33.402 2248 2248 I BurialPointService1: at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:409) 07-20 19:57:33.402 2248 2248 I BurialPointService1: at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:109) 07-20 19:57:33.402 2248 2248 I BurialPointService1: at android.app.Dialog.show(Dialog.java:342) 07-20 19:57:33.402 2248 2248 I BurialPointService1: at android.app.Presentation.show(Presentation.java:257) 07-20 19:57:33.402 2248 2248 I BurialPointService1: at com.adayo.aaop_deviceservice.service.BurialPointService.y(Unknown Source:48) 07-20 19:57:33.402 2248 2248 I BurialPointService1: at com.adayo.aaop_deviceservice.service.BurialPointService.B(Unknown Source:53) 07-20 19:57:33.402 2248 2248 I BurialPointService1: at com.adayo.aaop_deviceservice.service.BurialPointService.onCreate(Unknown Source:10) 07-20 19:57:33.402 2248 2248 I BurialPointService1: at android.app.ActivityThread.handleCreateService(ActivityThread.java:4209) 07-20 19:57:33.402 2248 2248 I BurialPointService1: at android.app.ActivityThread.access$1600(ActivityThread.java:238) 07-20 19:57:33.402 2248 2248 I BurialPointService1: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1955) 07-20 19:57:33.402 2248 2248 I BurialPointService1: at android.os.Handler.dispatchMessage(Handler.java:106) 07-20 19:57:33.402 2248 2248 I BurialPointService1: at android.os.Looper.loop(Looper.java:223) 07-20 19:57:33.402 2248 2248 I BurialPointService1: at android.app.ActivityThread.main(ActivityThread.java:7731) 07-20 19:57:33.402 2248 2248 I BurialPointService1: at java.lang.reflect.Method.invoke(Native Method) 07-20 19:57:33.402 2248 2248 I BurialPointService1: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 07-20 19:57:33.402 2248 2248 I BurialPointService1: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) private void createBackgroundToQnx() { int displayId = 1; DisplayManager dm = (DisplayManager) getSystemService(Context.DISPLAY_SERVICE); Display display = dm.getDisplay(displayId); if (display == null || !display.isValid()) { Log.e(TAG, "Invalid display: " + displayId); return; } try { Context displayContext = getApplicationContext().createDisplayContext(display); Presentation presentation = new Presentation(displayContext, display); View view = new View(this); view.setBackgroundColor(Color.BLACK); presentation.setContentView(view); presentation.show(); } catch (WindowManager.InvalidDisplayException e) { Log.i(TAG, "Failed to show presentation on display: " + display, e); } }
最新发布
08-08
07-20 19:57:33.608 2261 2261 I BurialPointService1: Failed to show presentation on display: Display id 1: DisplayInfo{"内置屏幕", displayId 1, FLAG_SECURE, FLAG_SUPPORTS_PROTECTED_BUFFERS, FLAG_TRUSTED, real 1920 x 720, largest app 1920 x 1920, smallest app 720 x 720, appVsyncOff 1000000, presDeadline 16666666, mode 2, defaultMode 2, modes [{id=2, width=1920, height=720, fps=60.000004}], hdrCapabilities HdrCapabilities{mSupportedHdrTypes=[], mMaxLuminance=500.0, mMaxAverageLuminance=500.0, mMinLuminance=0.0}, minimalPostProcessingSupported false, rotation 0, state ON, type INTERNAL, uniqueId "local:130", app 1920 x 720, density 160 (167.013 x 167.779) dpi, layerStack 1, colorMode 0, supportedColorModes [0], address {port=130}, deviceProductInfo null, removeMode 0}, DisplayMetrics{density=1.0, width=1920, height=720, scaledDensity=1.0, xdpi=167.013, ydpi=167.779}, isValid=true 07-20 19:57:33.608 2261 2261 I BurialPointService1: android.view.WindowManager$InvalidDisplayException: Unable to add window android.view.ViewRootImpl$W@81df4e9 -- the specified display can not be found 07-20 19:57:33.608 2261 2261 I BurialPointService1: at android.view.ViewRootImpl.setView(ViewRootImpl.java:1099) 07-20 19:57:33.608 2261 2261 I BurialPointService1: at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:409) 07-20 19:57:33.608 2261 2261 I BurialPointService1: at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:109) 07-20 19:57:33.608 2261 2261 I BurialPointService1: at android.app.Dialog.show(Dialog.java:342) 07-20 19:57:33.608 2261 2261 I BurialPointService1: at android.app.Presentation.show(Presentation.java:257) 07-20 19:57:33.608 2261 2261 I BurialPointService1: at com.adayo.aaop_deviceservice.service.BurialPointService.x(Unknown Source:105) 07-20 19:57:33.608 2261 2261 I BurialPointService1: at com.adayo.aaop_deviceservice.service.BurialPointService.A(Unknown Source:50) 07-20 19:57:33.608 2261 2261 I BurialPointService1: at com.adayo.aaop_deviceservice.service.BurialPointService.onCreate(Unknown Source:10) 07-20 19:57:33.608 2261 2261 I BurialPointService1: at android.app.ActivityThread.handleCreateService(ActivityThread.java:4209) 07-20 19:57:33.608 2261 2261 I BurialPointService1: at android.app.ActivityThread.access$1600(ActivityThread.java:238) 07-20 19:57:33.608 2261 2261 I BurialPointService1: at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1955) 07-20 19:57:33.608 2261 2261 I BurialPointService1: at android.os.Handler.dispatchMessage(Handler.java:106) 07-20 19:57:33.608 2261 2261 I BurialPointService1: at android.os.Looper.loop(Looper.java:223) 07-20 19:57:33.608 2261 2261 I BurialPointService1: at android.app.ActivityThread.main(ActivityThread.java:7731) 07-20 19:57:33.608 2261 2261 I BurialPointService1: at java.lang.reflect.Method.invoke(Native Method) 07-20 19:57:33.608 2261 2261 I BurialPointService1: at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:592) 07-20 19:57:33.608 2261 2261 I BurialPointService1: at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:947) 07-20 19:57:33.665 2261 2724 I BurialPointService1: parseJsonToEvent: json = {"command":{"id":"ipc","sub":"poweron"},"content":{"totalmileage":0,"resmileage":0}} 07-20 19:57:33.665 2261 2724 I BurialPointService1: parseJsonToEvent: key = totalmileage, value = 0.0 07-20 19:57:33.666 2261 2724 I BurialPointService1: parseJsonToEvent: key = resmileage, value = 0 07-20 19:57:33.666 2261 2724 I BurialPointService1: sendSyncEvent: failed aAnalyticsManager is null! 07-20 19:57:34.408 2261 2261 I BurialPointService1: onServiceConnect 埋点连接成功! private void createBackgroundToQnx() { DisplayManager displayManager = (DisplayManager)this.getSystemService(Context.DISPLAY_SERVICE); Display[] displays = displayManager.getDisplays(); Log.i(TAG, "createBackgroundToQnx displays = " + Arrays.toString(displays)); for (Display display : displayManager.getDisplays()) { if (display.getDisplayId() != Display.DEFAULT_DISPLAY) { if (!display.isValid()) { Log.i(TAG, "createBackgroundToQnx display is invalid ! displayID = " + display.getDisplayId()); continue; } try { Presentation presentation = new Presentation(this, display); View view = new View(this); view.setBackgroundColor(Color.BLACK); presentation.setContentView(view); presentation.show(); } catch (WindowManager.InvalidDisplayException e) { Log.i(TAG, "Failed to show presentation on display: " + display, e); } } } }
08-07
``` FATAL EXCEPTION: main Process: com.oem.qisda, PID: 6430 java.lang.RuntimeException: Unable to create service com.oem.qisda.CpuInfoService: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@9519714 -- permission denied for window type 2038 at android.app.ActivityThread.handleCreateService(ActivityThread.java:4568) at android.app.ActivityThread.access$1700(ActivityThread.java:257) at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2111) at android.os.Handler.dispatchMessage(Handler.java:106) at android.os.Looper.loopOnce(Looper.java:201) at android.os.Looper.loop(Looper.java:288) at android.app.ActivityThread.main(ActivityThread.java:7911) at java.lang.reflect.Method.invoke(Native Method) at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:681) at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1009) Caused by: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@9519714 -- permission denied for window type 2038 at android.view.ViewRootImpl.setView(ViewRootImpl.java:1215) at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:400) at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:139) at com.oem.qisda.CpuInfoService.onCreate(CpuInfoService.java:105) at android.app.ActivityThread.handleCreateService(ActivityThread.java:4555) at android.app.ActivityThread.access$1700(ActivityThread.java:257)  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2111)  at android.os.Handler.dispatchMessage(Handler.java:106)  at android.os.Looper.loopOnce(Looper.java:201)  at android.os.Looper.loop(Looper.java:288)  at android.app.ActivityThread.main(ActivityThread.java:7911)  at java.lang.reflect.Method.invoke(Native Method)  at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:681)  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1009)```怎么解决
03-08
<think>嗯,用户遇到了一个Android应用的崩溃问题,错误日志显示的是`WindowManager$BadTokenException`,具体原因是权限被拒绝,窗口类型2038。我需要帮他们解决这个问题。首先,我得理解这个错误的常见原因。 窗口类型2038,这个数字可能对应的是系统窗口类型。Android中,系统窗口需要特定的权限,比如`SYSTEM_ALERT_WINDOW`。如果应用没有申请这个权限,或者没有正确动态请求,就会导致这个错误。另外,在Android 8.0(API 26)之后,某些窗口类型的使用方式可能有所变化,比如必须使用`TYPE_APPLICATION_OVERLAY`代替之前的类型。 查看堆栈跟踪,问题出现在`CpuInfoService`的`onCreate`方法中,这里可能是在Service里尝试显示一个窗口,比如悬浮窗。Service中直接显示窗口需要注意权限和窗口类型是否正确。 接下来,可能的解决步骤包括: 1. **检查窗口类型**:确认使用的窗口类型是否为`TYPE_APPLICATION_OVERLAY`(适用于API 26+)。如果是旧版本,可能需要条件判断,使用不同的类型。 2. **添加权限**:在AndroidManifest.xml中添加`<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />`,并且动态请求该权限,尤其是在Android 6.0及以上版本。 3. **检查Service的上下文**:在Service中使用`getApplicationContext()`而不是`this`来获取Context,避免可能的token问题。 4. **目标SDK版本适配**:如果应用的目标SDK版本较高,可能需要调整窗口类型的处理方式,符合新的API要求。 另外,用户可能需要检查是否在Service中正确初始化了WindowManager,以及LayoutParams的设置是否正确。例如,使用`WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY`而不是硬编码的2038,因为不同系统版本类型值可能不同。 还有,动态权限请求的处理是否到位,用户是否在运行时授予了权限。特别是`SYSTEM_ALERT_WINDOW`权限需要用户手动在设置中开启,所以可能需要引导用户去授权。 总结,解决方案应该围绕权限申请、正确的窗口类型设置以及上下文的使用展开。可能需要分步骤指导用户修改代码,并处理不同Android版本的兼容性问题。</think>这个错误是典型的Android窗口权限问题,主要涉及系统窗口权限的缺失。以下是分步解决方案: $$ \text{解决方案步骤} $$ 1. **添加悬浮窗权限声明** ```xml <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> ``` 在AndroidManifest.xml中添加权限声明 2. **适配Android O+的窗口类型** ```java int layoutType; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { layoutType = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; } else { layoutType = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; } ``` 3. **动态权限请求(关键步骤)** ```java // 在Activity中请求权限 if (!Settings.canDrawOverlays(this)) { Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName())); startActivityForResult(intent, REQUEST_CODE); } ``` 4. **修改WindowManager初始化方式** ```java // 在Service中使用正确的Context WindowManager windowManager = (WindowManager) getApplicationContext().getSystemService(WINDOW_SERVICE); WindowManager.LayoutParams params = new WindowManager.LayoutParams( width, height, layoutType, // 使用步骤2定义的type WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSLUCENT ); ``` 5. **Service代码示例修正** ```java public class CpuInfoService extends Service { @Override public void onCreate() { super.onCreate(); if (checkDrawOverlayPermission()) { showFloatingWindow(); } } private boolean checkDrawOverlayPermission() { return Settings.canDrawOverlays(this); } } ``` $$ \text{注意事项} $$ 1. **API版本适配矩阵** | API Level | 要求窗口类型 | 所需权限 | |-----------|----------------------|--------------------------| | < 26 | TYPE_SYSTEM_ALERT | SYSTEM_ALERT_WINDOW | | ≥ 26 | TYPE_APPLICATION_OVERLAY | SYSTEM_ALERT_WINDOW | 2. **常见错误排查点** - 未在manifest声明权限 - 未动态请求权限(仅声明无效) - 错误使用Activity Context替代Application Context - 混淆了TYPE_SYSTEM_ALERT和TYPE_APPLICATION_OVERLAY的使用场景 3. **进阶优化建议** ```java // 添加窗口显示异常捕获 try { windowManager.addView(floatingView, params); } catch (WindowManager.BadTokenException e) { Log.e("WindowError", "Failed to add view: " + e.getMessage()); // 触发权限请求流程 requestOverlayPermission(); } ``` 这个问题的本质是Android系统对悬浮窗权限的管控升级,需要特别注意从Android 8.0开始引入的TYPE_APPLICATION_OVERLAY类型。建议使用Android Studio的Layout Inspector工具验证窗口层级,同时使用adb命令`adb shell dumpsys window windows`检查窗口属性是否正常。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值