WindowManager视图添加不显示——悬浮窗的权限适配问题
悬浮窗适配方案
目前市场上有两种方式,第一种是正规流程,系统在没有赋予APP悬浮窗权限,会先跳转到权限授权界面,引导用户开启悬浮窗权限,然后再去弹相应悬浮窗,比如QQ一些主流应用这样做;第二种就是利用系统的漏洞,绕过权限申请,该方法不提倡,比如UC就是这样做,不过在一些特殊机型不行,比如miui8.
正常适配流程
Android6.0之前版本
由于google没有对这个权限进行单独处理,到时不同手机厂家各自定制不同授权界面,到时适配难度增加。具体解决方案,之前看过一位博主解决方案,目前最详细,这篇博客文章Android 悬浮窗权限各机型各系统适配大全。主要适配的机子有一下几个手机厂家:小米、华为、oppo、魅族、360。详情可以直接通过该链接查阅,博主讲解很详细。
Android6.0及之后版本
google后面对权限问题进行严格控制,悬浮窗权限在6.0以及之后版本开始单独拿出来管理。
首先,我们必须在Mainfest静态申请权限
<uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />
然后再判断是否被授权,程序安装默认情况下是没有授权的。下面是是否授权代码
private boolean permissionCheck(Context context) {
Boolean result = true;
if (Build.VERSION.SDK_INT >= 23) {
try {
Class clazz = Settings.class;
Method canDrawOverlays = clazz.getDeclaredMethod("canDrawOverlays", Context.class);
result = (Boolean) canDrawOverlays.invoke(null, context);
} catch (Exception e) {
Log.e(TAG, Log.getStackTraceString(e));
}
}
return result;
}
所以要动态申请,引导用户到相应的授权界面去授权悬浮窗的权限给APP。
public static void permissionApplyInternal(Context context) throws NoSuchFieldException, IllegalAccessException {
Class clazz = Settings.class;
Field field = clazz.getDeclaredField("ACTION_MANAGE_OVERLAY_PERMISSION");
Intent intent = new Intent(field.get(null).toString());
intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setData(Uri.parse("package:" + context.getPackageName()));
context.startActivity(intent);
}