Android8.0在广播接收器中使用弹出窗
解决报错信息:WindowManager$BadTokenException: Unable to add windowandroid.view.ViewRootlmplsW@61b864 permission denied for window type 2010
WindowManager$BadTokenException: Unable to add windowandroid.view.ViewRootlmplsW@61b864 permission denied for window type 2010
一:
import static android.content.ContentValues.TAG;
import static android.view.WindowManager.LayoutParams.TYPE_APPLICATION_PANEL;
public class ForceOfflineReceiver extends BroadcastReceiver {
@Override
public void onReceive(final Context context, Intent intent) {
AlertDialog.Builder dialogBuilder = new AlertDialog.Builder(context);
dialogBuilder.setTitle("Warning");
Log.d(TAG,"test+++++++++++++");
dialogBuilder.setMessage("You are forced to be offline. Please try to login again.");
dialogBuilder.setCancelable(false);
dialogBuilder.setPositiveButton("OK",
new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
}
});
AlertDialog alertDialog = dialogBuilder.create();
// 需要设置AlertDialog的类型,保证在广播接收器中可以正常弹出
'安卓8.0之前 (WindowManager.LayoutParams.TYPE_SYSTEM_ALERT)'
'安卓8.0 (WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY)'
alertDialog.getWindow().setType(WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY);
alertDialog.show();
}
}
AlertDialog.Builder:构建一个对话框
setCancelable():将对话框设为不可取消(防止点击 Back 键)
setPositiveButton():为对话框注册确定按钮
TYPE_SYSTEM_ALERT:对话框类型(在活动接收器中弹出)
TYPE_APPLICATION_OVERLAY:对话框类型(安卓8.0)
二:
在 AndroidManifest.xml 中声明 android.permission.SYSTEM_ALERT_WINDOW 权限。
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />