我正在修复一个不是我开发的 android 应用程序,几天前客户要求我将 targetSdkVersion 设置为 26(之前是 14),之后我注意到应用程序在某些情况下崩溃,例如崩溃时显示一个 ProgressDialog。这是存在此问题的代码部分:
mProgressDialog.setTitle(getString(R.string.downloading_data));
mProgressDialog.setMessage(mAlertMsg);
Drawable icon = getActivity().getDrawable(android.R.drawable.ic_dialog_info);
icon.setColorFilter(Color.parseColor("#00cbac"), PorterDuff.Mode.SRC_ATOP);
mProgressDialog.setIcon(icon);
mProgressDialog.setIndeterminate(true);
mProgressDialog.setCancelable(false);
mProgressDialog.setButton(getString(R.string.cancel), loadingButtonListener);
mProgressDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_SYSTEM_ALERT);
mProgressDialog.show();
执行最后一行时,应用程序崩溃并在 Logcat 中出现此错误:
android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@b784d3a -- permission denied for window type 2003
当应用程序在具有 Android 8 和 9 的设备上运行时会出现此问题。我寻找类似问题的解决方案,我发现使用WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY
而不是更好TYPE_SYSTEM_ALERT
,然后我修改了我编写的代码的倒数第二行在这篇文章中但它没有改变任何东西,应用程序崩溃相同并且在日志中出现此错误:
android.view.WindowManager$BadTokenException: Unable to add window android.view.ViewRootImpl$W@b784d3a -- permission denied for window type 2038
在清单中,我得到了许可:
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
我还从设备设置中启用了应用程序的所有权限。我怎么解决这个问题?