Android 悬浮窗适配问题

最近在做悬浮窗相关功能,关于悬浮窗权限问题做一下版本区分的讲解,着急使用的可以直接去完整代码看

版本号>=23

大家最常用的就是获取是否有悬浮窗权限,如果没有就去开启
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
   
// 判断是否有悬浮窗权限,版本号>= 23才可
            return Settings.canDrawOverlays(context);
        }
  // 如果没有权限就去申请开启权限
  if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
   
                try {
   
                    val intent = Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION)
                    intent.data = Uri.parse("package:" + context?.packageName)
                    startActivityForResult(intent, REQUEST_CODE)
                } catch (e: Exception) {
   
                    L.d(e.message)

                }
            }
但是, Vivo是特例,在vivo x20 plusA Android8.1.0的获取到的权限一直是true,但是并没有开启悬浮窗权限,所以需要单端判断是否有权限
public static boolean hasFloatFirstPermission(Context context) {
   
        if (context != null) {
   
            String packageName = context.getPackageName();
            try {
   
                Cursor query = context.getContentResolver()
                        .query(Uri.parse("content://com.iqoo.secure.provider.secureprovider/allowfloatwindowapp"), null,
                                "pkgname = ?", new String[] {
   packageName}, null);
                if (query == null) {
   
                    return hasFloatSecondPermission(context);
                }
                query.getColumnNames();
                if (query.moveToFirst()) {
   
                    int i = query.getInt(query.getColumnIndex("currentlmode"));
                    query.close();
                    if (i == 0) {
   
                        return true;
                    }
                    return false;
                }
                query.close();
                return hasFloatSecondPermission(context);
            } catch (Exception unused) {
   
                return hasFloatSecondPermission(context);
            }
        } else {
   
            throw new IllegalArgumentException("context is null");
        }
    }
/**
     * 判断vivo数据库
     */
    public static boolean hasFloatSecondPermission(Context context) {
   
        String packageName = context.getPackageName();
        try {
   
            Cursor query = context.getContentResolver()
                    .query(Uri.parse("content://com.vivo.permissionmanager.provider.permission/float_window_apps"),
                            null, "pkgname = ?", new String[] {
   packageName}, null);
            if (query != null) {
   
                if (query.moveToFirst()) {
   
                    int i = query.getInt(query.getColumnIndex("currentmode"));
                    query.close();
                    if (i == 0) {
   
                        return true;
                    }
                    return false;
                }
                query.close();
            }
        } catch (Exception unused) {
   
        }
        return false;
    }
不仅如此,vivo获取悬浮窗权限也比较特殊.前面虽然判断出来没有权限了,但是开启悬浮窗权限的intent也不生效,需要再次区分判断.
public static boolean viVoFloatRequest(Activity context, int requestCode) {
   
        try {
   
            String str = Build.MODEL;
            if ((!str.contains("Y85") 
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值