BadTokenException 解決方案


極力推薦文章:歡迎收藏
Android 干貨分享

閱讀五分鍾,每日十點,和您一起終身學習,這里是程序員Android

BadTokenException:

log 舉例

03-12 14:55:13.734  5564  5564 E AndroidRuntime: FATAL EXCEPTION: main
03-12 14:55:13.734  5564  5564 E AndroidRuntime: Process: com.android.fmradio, PID: 5564
03-12 14:55:13.734  5564  5564 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.734  5564  5564 E AndroidRuntime: 	at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$getRunnable$0(LoadedApk.java:1401)
03-12 14:55:13.734  5564  5564 E AndroidRuntime: 	at android.app.-$$Lambda$LoadedApk$ReceiverDispatcher$Args$_BumDX2UKsnxLVrE6UJsJZkotuA.run(Unknown Source:2)
03-12 14:55:13.734  5564  5564 E AndroidRuntime: 	at android.os.Handler.handleCallback(Handler.java:873)
03-12 14:55:13.734  5564  5564 E AndroidRuntime: 	at android.os.Handler.dispatchMessage(Handler.java:99)
03-12 14:55:13.734  5564  5564 E AndroidRuntime: 	at android.os.Looper.loop(Looper.java:193)
03-12 14:55:13.734  5564  5564 E AndroidRuntime: 	at android.app.ActivityThread.main(ActivityThread.java:6702)
03-12 14:55:13.734  5564  5564 E AndroidRuntime: 	at java.lang.reflect.Method.invoke(Native Method)
03-12 14:55:13.734  5564  5564 E AndroidRuntime: 	at com.android.internal.os.RuntimeInit$MethodAndArgsCaller.run(RuntimeInit.java:493)
03-12 14:55:13.734  5564  5564 E AndroidRuntime: 	at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:911)
03-12 14:55:13.734  5564  5564 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.734  5564  5564 E AndroidRuntime: 	at android.view.ViewRootImpl.setView(ViewRootImpl.java:851)
03-12 14:55:13.734  5564  5564 E AndroidRuntime: 	at android.view.WindowManagerGlobal.addView(WindowManagerGlobal.java:356)
03-12 14:55:13.734  5564  5564 E AndroidRuntime: 	at android.view.WindowManagerImpl.addView(WindowManagerImpl.java:93)
03-12 14:55:13.734  5564  5564 E AndroidRuntime: 	at android.app.Dialog.show(Dialog.java:329)
03-12 14:55:13.734  5564  5564 E AndroidRuntime: 	at com.android.fmradio.FmService$FmServiceBroadcastReceiver.onReceive(FmService.java:322)
03-12 14:55:13.734  5564  5564 E AndroidRuntime: 	at android.app.LoadedApk$ReceiverDispatcher$Args.lambda$getRunnable$0(LoadedApk.java:1391)
03-12 14:55:13.734  5564  5564 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 彈窗行為變更

至此,本篇已結束,如有不對的地方,歡迎您的建議與指正。同時期待您的關注,感謝您的閱讀,謝謝!

微信關注公眾號:  程序員Android,領福利


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM