悬浮窗的权限申请在 Android 6.0 是一个分水岭,在 Android 6.0 之前的适配很混乱,到了 Android 6.0 就有了一个统一的标准。
-
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>
在 AndroidManifest 中配置权限。 -
在代码中检查是否有悬浮窗权限,使用
Settings.canDrawOverlays
这个方法进行检查,但是要注意,这个方法要在 6.0 的版本之上,才能正常使用,低于这个版本就可能有问题。 -
由于悬浮窗权限不在危险权限的系列,所以也无法进行动态权限申请,Google 默认是开放这个权限的,但是国内厂商基本上都把这个权限给关闭了。只能让用户到设置之中打开这个权限。
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION, Uri.parse("package:" + getPackageName())); startActivity(intent);
-
显示悬浮窗的时候要使用
WindowManager.LayoutParams.TYPE_SYSTEM_ALERT
这个 type ,虽然使用WindowManager.LayoutParams.TYPE_TOAST
可以绕过部分机型的悬浮窗权限,但是效果却不好,比如在华为上试验的时候,发现过一会悬浮窗就会关掉,不稳定,不推荐使用。