android 悬浮窗相关配置以及设置背景透明

悬浮窗相信都会用到,配合背景透明以及webview-js注入可以做很多事情。

1、判断权限

 public static boolean checkFloatPermission(Context context) {
        if (!hasPermission(context, "android.permission.SYSTEM_ALERT_WINDOW")) {
            return false;
        }
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)
            return true;
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            try {
                Class cls = Class.forName("android.content.Context");
                Field declaredField = cls.getDeclaredField("APP_OPS_SERVICE");
                declaredField.setAccessible(true);
                Object obj = declaredField.get(cls);
                if (!(obj instanceof String)) {
                    return false;
                }
                String str2 = (String) obj;
                obj = cls.getMethod("getSystemService", String.class).invoke(context, str2);
                cls = Class.forName("android.app.AppOpsManager");
                Field declaredField2 = cls.getDeclaredField("MODE_ALLOWED");
                declaredField2.setAccessible(true);
                Method checkOp = cls.getMethod("checkOp", Integer.TYPE, Integer.TYPE, String.class);
                int result = (Integer) checkOp.invoke(obj, 24, Binder.getCallingUid(), context.getPackageName());
                return result == declaredField2.getInt(cls);
            } catch (Exception e) {
                return false;
            }
        } else {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                AppOpsManager appOpsMgr = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
                if (appOpsMgr == null)
                    return false;
                int mode = appOpsMgr.checkOpNoThrow("android:system_alert_window", android.os.Process.myUid(), context
                        .getPackageName());
                return Settings.canDrawOverlays(context) || mode == AppOpsManager.MODE_ALLOWED || mode == AppOpsManager.MODE_IGNORED;
            } else {
                return Settings.canDrawOverlays(context);
            }
        }
    }
    public static boolean hasPermission(Context context, String permission) {
        if (context == null) {
            return false;
        }
        try {
            PackageInfo info = context.getPackageManager().getPackageInfo(context.getPackageName(), PackageManager.GET_PERMISSIONS);
            if (info.requestedPermissions != null) {
                for (String p : info.requestedPermissions) {
                    if (p.equals(permission)) {
                        return true;
                    }
                }
            }
        } catch (Exception e) {
            e.printStackTrace();
        }
        return false;
    }
package com.add.cf.util;

import android.content.Context;
import android.view.WindowManager;

public class WindowManage {
    private static WindowManager.LayoutParams wmParams;
    private static WindowManager mWindowManager;
    public static WindowManager getWindowManager(Context context) {
        if (mWindowManager == null) {
            mWindowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
        }
        return mWindowManager;
    }

    /**
     * @param context
     * @return
     */
    public static WindowManager.LayoutParams getWindowManagerParams() {
        if (wmParams == null) {
            wmParams = new WindowManager.LayoutParams();
        }
        return wmParams;
    }
}

 配置悬浮窗

   if (wmParams == null) {
                wmParams = WindowManage.getWindowManagerParams();
            }
            int layout_flag;
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                layout_flag = WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY;
            } else {
                layout_flag = WindowManager.LayoutParams.TYPE_PHONE;
            }
            initWebView();
            wmParams.type = layout_flag;
            wmParams.format = PixelFormat.RGBA_8888;
//背景透明
            wmParams.alpha = 0.0f;
            wmParams.screenOrientation = 1;
            wmParams.flags =
                    WindowManager.LayoutParams.FLAG_NOT_TOUCH_MODAL |
                            //LayoutParams.FLAG_NOT_FOCUSABLE |
                            WindowManager.LayoutParams.FLAG_KEEP_SCREEN_ON |
                            //                            FLAG_FULLSCREEN |
                            WindowManager.LayoutParams.FLAG_LAYOUT_IN_SCREEN;
            //                wmParams.width = WindowManager.LayoutParams.WRAP_CONTENT;
            wmParams.width = WindowManager.LayoutParams.MATCH_PARENT;
            wmParams.height = WindowManager.LayoutParams.MATCH_PARENT;
            windowManager.addView(llRoot, wmParams);

 这样就ok了

 

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

carden_coder

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值