BadTokenException 解決方案


極力推薦Android 開發大總結文章:歡迎收藏
Android 開發技術文章大總結

BadTokenException:
log 舉例
03-12 14:55:13.73455645564 E AndroidRuntime: FATAL EXCEPTION: main 03-12 14:55:13.73455645564 E AndroidRuntime: Process: com.android.fmradio, PID: 5564 03-12 14:55:13.73455645564 E AndroidRuntime: java.lang.RuntimeException: Error receiving broadcast Intent { act=android.intent.action.HEADSET_PLUG flg=0x40000010 (has extras) } in com.android.fmradio.FmService$FmServiceBroadcastReceiver@b3d2a03 03-12 14:55:13.73455645564 E AndroidRuntime:at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$getRunnable$0(LoadedApk.java:1401) 03-12 14:55:13.73455645564 E AndroidRuntime:at android.app.-$$Lambda$LoadedApk$ReceiverDispatcher$Args$_BumDX2UKsnxLVrE6UJsJZkotuA.run(Unknown Source:2) 03-12 14:55:13.73455645564 E AndroidRuntime:at android.os.Handler.handleCallback(Handler.java:873) 03-12 14:55:13.73455645564 E AndroidRuntime:at android.os.Handler.dispatchMessage(Handler.java:99) 03-12 14:55:13.73455645564 E AndroidRuntime:at android.os.Looper.loop(Looper.java:193) 03-12 14:55:13.73455645564 E AndroidRuntime:at android.app.ActivityThread.main(ActivityThread.java:6702) 03-12 14:55:13.73455645564 E AndroidRuntime:at java.lang.reflect.Method.invoke(Native Method) 03-12 14:55:13.73455645564 E AndroidRuntime:at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493) 03-12 14:55:13.73455645564 E AndroidRuntime:at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:911) 03-12 14:55:13.73455645564 E AndroidRuntime: Caused by: android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@f652dba -- permission denied for window type 2003 03-12 14:55:13.73455645564 E AndroidRuntime:at android.view.ViewRootImpl.setView(ViewRootImpl.java:851) 03-12 14:55:13.73455645564 E AndroidRuntime:at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:356) 03-12 14:55:13.73455645564 E AndroidRuntime:at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93) 03-12 14:55:13.73455645564 E AndroidRuntime:at android.app.Dialog.show(Dialog.java:329) 03-12 14:55:13.73455645564 E AndroidRuntime:at com.android.fmradio.FmService$FmServiceBroadcastReceiver.onReceive(FmService.java:322) 03-12 14:55:13.73455645564 E AndroidRuntime:at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$getRunnable$0(LoadedApk.java:1391) 03-12 14:55:13.73455645564 E AndroidRuntime:... 8 more
產生原因
Android 8.0 之後如果要彈出系統彈窗,需要使用 TYPE_APPLICATION_OVERLAY
以及
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
來進行系統彈窗,否則會報以下異常 BadTokenException: Unable to add window android.view.ViewRootImpl$W@f652dba -- permission denied for window type 2003
解決方案
系統彈窗,請用 TYPE_APPLICATION_OVERLAY 替換之前的Windows Type。
Dialog mFMDialog = new AlertDialog.Builder(context) .setTitle(R.string.airplane_title).setMessage(R.string.airplane_message) .setPositiveButton(R.string.close_FM, new DialogInterface.OnClickListener() { @Override public void onClick(DialogInterface dialog, int which) { } } ).setCancelable(false).create(); // Android 8.0 之後彈出系統彈窗,需要使用TYPE_APPLICATION_OVERLAY // <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" /> // 一下兩個 之前常用的系統的Dialog 會報 // BadTokenException: Unable to add window android.view.ViewRootImpl$W@f652dba -- permission denied for window type 2003 //mFMDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_DIALOG); //mFMDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT); mFMDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY); mFMDialog.show();
參考 Google Android GO 行為變更
Google 官方連結如下:
Android 8.0 Alert 彈窗行為變更
Android 8.0 Alert 彈窗行為變更
