Android8.0在广播接收器中使用弹出窗

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" />

发布了43 篇原创文章 · 获赞 19 · 访问量 3084

猜你喜欢

转载自blog.csdn.net/qq_41974199/article/details/103241533