極力推薦文章:歡迎收藏
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 彈窗行為變更
至此,本篇已結束,如有不對的地方,歡迎您的建議與指正。同時期待您的關注,感謝您的閱讀,謝謝!