Andorid 悬浮窗的适配指北
我们有时候需要显示一个悬浮窗,悬浮窗由服务开启,里面会有一些操作
但是我在开发时遇到高版本 Android12 和低版本4.4 ,显示不一样的地方
这边整理了下适配的方法方案
一:根据版本不一的时候,params的type设置为不一样的type
为 WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
或者 WindowManager.LayoutParams.TYPE_SYSTEM_ALERT;
/** * 设置悬浮框基本参数(位置、宽高等) */ private void initWindow() { mWindowManager = (WindowManager) ServiceContext.getSystemService(Context.WINDOW_SERVICE); wmParams = getParams();//设置好悬浮窗的参数 // 悬浮窗默认显示以左上角为起始坐标 wmParams.gravity = Gravity.LEFT | Gravity.TOP; //悬浮窗的开始位置,因为设置的是从左上角开始,所以屏幕左上角是x=0;y=0 wmParams.x = 70; wmParams.y = 210; //检查版本,注意当type为TYPE_APPLICATION_OVERLAY时,铺满活动窗口,但在关键的系统窗口下面,如状态栏或IME if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { wmParams.type = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY; } else { wmParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; } // wmParams.type = WindowManager.LayoutParams.TYPE_SYSTEM_ALERT; //得到容器,通过这个inflater来获得悬浮窗控件 inflater = LayoutInflater.from(ServiceContext.getApplicationContext()); // 获取浮动窗口视图所在布局 mFloatingLayout = inflater.inflate(R.layout.alert_float_video_layout, null); // 添加悬浮窗的视图 mWindowManager.addView(mFloatingLayout, wmParams); }
二:不能忘了权限配置
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
三:高版本需要动态获取权限引导用户配置 悬浮窗权限
//检查悬浮窗显示在app上的权限 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { if (!Settings.canDrawOverlays(context)) { //启动Activity让用户授权 Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION); startActivity(intent); return; } }
这样就能正常适配悬浮窗显示开启了