转载请注明出处:Android悬浮窗权限适配

悬浮窗相信大家都不陌生,比如360手机卫士的加速球,视频应用的小窗,可以占用很少的空间,又能保持跟用户的交互。悬浮窗可以通过WindowManager.addView添加。具体用法可以看Android悬浮窗用法总结,按照这篇文章添加过悬浮窗之后,会发现有的手机上显示不出来,这就是权限的问题了。

悬浮窗权限

使用 type 值为 WindowManager.LayoutParams.TYPE_PHONE 或 WindowManager.LayoutParams.TYPE_SYSTEM_ALERT 需要申请 android.permission.SYSTEM_ALERT_WINDOW 权限。

  • API >=23,需要在manifest中申请权限,并在每次需要用到权限的时候检查是否已有该权限,因为用户随时可以取消掉。具体可以看
    Android 6.0 运行时权限处理完全解析
    Android M 权限最佳实践
    检测方法:调用系统Settings.canDrawOverlays
  • API >=18,只需要在manifest中申请权限。
    对于一般手机,manifest中声明的权限在安装的时候会默认授权,并不需要处理。
    对于某些rom,需要用AppOpsManager.checkOp方法检测。
  • API <18,默认有悬浮窗权限,不需要处理。

type 值为 WindowManager.LayoutParams.TYPE_TOAST 不需要权限。

  • API >25,TYPE_TOAST 已经被谷歌制裁了,会出现自动消失的情况,具体看 这里
  • API >= 19 ,可以接收触摸和按键事件。
  • API <19,无法接收无法接收触摸和按键事件,不需要权限和无法接受触摸事件的源码分析:Android悬浮窗TYPE_TOAST小结源码分析
    之前有人做过绕过权限显示悬浮窗,就是用的TYPE_TOAST ,不推荐使用这种方法。
    Android无需权限显示悬浮窗, 兼谈逆向分析app
    Android 悬浮窗的小结

检测某些rom的悬浮窗权限

到这里,就明白我们只需要处理18<=API<23下某些rom的权限。
为什么某些rom那么特殊呢?
因为在API 18,Google新增了一个函数AppOpsManager,不过在这个版本,该函数是隐藏的 (Android 4.3 隐藏功能 App Ops 分析),到API 19才公开。用这个函数可以对manifest申请的权限做一层限制,于是就有了360手机卫士,小米安全中心。。。

检测这些rom的权限,方法是一样的,可以通过反射使用AppOpsManager.checkOp

private static final int OP_SYSTEM_ALERT_WINDOW = 24;boolean isPermitted = checkOp(context, OP_SYSTEM_ALERT_WINDOW);private static boolean checkOp(Context context, int op) {        AppOpsManager manager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);        try {            Method method = AppOpsManager.class.getDeclaredMethod("checkOp", int.class, int.class, String.class);            return AppOpsManager.MODE_ALLOWED == (int) method.invoke(manager, op, Binder.getCallingUid(), context.getPackageName());        } catch (Exception e) {            Log.e(TAG, Log.getStackTraceString(e));        }        return false;    }

判断手机rom

检测应用是否有权限,可以防止异常,或者点击事件没反应。为了给用户提供更好地体验,我们应该引导用户去权限设置页面开启权限。这些特殊rom的权限设置是不一样的,所以需要先判断手机rom,再分别去对应的权限设置页面。

具体方法见:Android判断手机ROM

打开某些rom的权限设置页面

未完待续。。。

参考:

  1. https://github.com/czy1121/settingscompat
  2. Android 悬浮窗权限各机型各系统适配大全

http://blog.csdn.net/adrianandroid/article/details/49911681

http://blog.csdn.net/u012573920/article/details/49514115

http://blog.csdn.net/adrianandroid/article/details/49911681

http://www.cnblogs.com/fangyucun/p/4027750.html

http://blog.csdn.net/xx326664162/article/details/52438706

更多相关文章

  1. 如何看待安卓未来的发展
  2. Android触屏分发机制(一)
  3. 【转】.Android-sharedUserId数据权限
  4. Android中 获取手机通讯录和手机机主手机号码
  5. Android(安卓)状态栏, 标题栏, 导航栏,系统栏,应用栏的区别和解释
  6. Android事件分发机制完全解析,带你从源码的角度彻底理解(上) (出
  7. React Native在Android当中代码集成
  8. Android中事件的分发机制
  9. Android(安卓)使用Settings 数据库demo(源码)以及adb 读写settings

随机推荐

  1. android 手机欢迎界面不显示的问题?
  2. Android(安卓)开机视频
  3. Android(安卓)CursorAdapter
  4. android recovery模式流程
  5. Android(安卓)四大组件流程、Handler、As
  6. (ios实现)用c/c++混合编程方式为ios/andr
  7. Kotlin Android
  8. Android(安卓)N Settings 架构剖析
  9. 正确获得android设备的IP地址
  10. Android的Proxy/Delegate Application框