悬浮窗的权限申请在 Android 6.0 是一个分水岭,在 Android 6.0 之前的适配很混乱,到了 Android 6.0 就有了一个统一的标准。

  1. <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>在 AndroidManifest 中配置权限。

  2. 在代码中检查是否有悬浮窗权限,使用 Settings.canDrawOverlays 这个方法进行检查,但是要注意,这个方法要在 6.0 的版本之上,才能正常使用,低于这个版本就可能有问题。

  3. 由于悬浮窗权限不在危险权限的系列,所以也无法进行动态权限申请,Google 默认是开放这个权限的,但是国内厂商基本上都把这个权限给关闭了。只能让用户到设置之中打开这个权限。

    Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION,
                                        Uri.parse("package:" + getPackageName()));
    startActivity(intent);
    
  4. 显示悬浮窗的时候要使用 WindowManager.LayoutParams.TYPE_SYSTEM_ALERT 这个 type ,虽然使用 WindowManager.LayoutParams.TYPE_TOAST 可以绕过部分机型的悬浮窗权限,但是效果却不好,比如在华为上试验的时候,发现过一会悬浮窗就会关掉,不稳定,不推荐使用。