美文网首页
检测是否具有悬浮窗权限Settings.canDrawOverl

检测是否具有悬浮窗权限Settings.canDrawOverl

作者: kongzue | 来源:发表于2020-04-16 15:23 被阅读0次

    前情提要

    有项目要实现悬浮窗,但在检查是否有悬浮窗权限时出现使用系统方法:Settings.canDrawOverlays(context) 总是返回 true 而实际上没有授权悬浮窗权限的情况,测试设备为一加7Pro(Android Q)应该是系统 bug,上Stack Overflow瞅了一圈应该还不是个例,解决方案搬运如下:

    解决方法:

    使用以下方法判断

    public static boolean canDrawOverlays(Context context) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) return true;
        else if (android.os.Build.VERSION.SDK_INT >= Build.VERSION_CODES.O_MR1) {
            return Settings.canDrawOverlays(context);
        } else {
            if (Settings.canDrawOverlays(context)) return true;
            try {
                WindowManager mgr = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE);
                if (mgr == null) return false; //getSystemService might return null
                View viewToAdd = new View(context);
                WindowManager.LayoutParams params = new WindowManager.LayoutParams(0, 0, android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.O ?
                        WindowManager.LayoutParams.TYPE_APPLICATION_OVERLAY : WindowManager.LayoutParams.TYPE_SYSTEM_ALERT,
                        WindowManager.LayoutParams.FLAG_NOT_TOUCHABLE | WindowManager.LayoutParams.FLAG_NOT_FOCUSABLE, PixelFormat.TRANSPARENT);
                viewToAdd.setLayoutParams(params);
                mgr.addView(viewToAdd, params);
                mgr.removeView(viewToAdd);
                return true;
            } catch (Exception e) {
                e.printStackTrace();
            }
            return false;
        }
    }
    

    原帖地址:

    https://stackoverflow.com/questions/46173460/why-in-android-8-method-settings-candrawoverlays-returns-false-when-user-has

    相关文章

      网友评论

          本文标题:检测是否具有悬浮窗权限Settings.canDrawOverl

          本文链接:https://www.haomeiwen.com/subject/cvnrvhtx.html