舒心、快乐,比什么都重要

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;
            }
        }

这样就能正常适配悬浮窗显示开启了

 

posted @ 2022-07-26 11:55  Arcturis  阅读(981)  评论(0编辑  收藏  举报