检测是否具有悬浮窗权限Settings.canDrawOverlays(context) 不靠谱的解决方法

前情提要

有项目要实现悬浮窗,但在检查是否有悬浮窗权限时出现使用系统方法: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.canDrawOverlays(context) 不靠谱的解决方法)