需求确认:

最近产品在系统升级方面加了一个强制升级的需求,安装完成后需要通过dialog提示用户重启,如果当即拒绝,一个小时后继续弹出此dialog。

问题场景:

首先想到的是通过AlarManager定时通知Receiver,再由Receiver通知Service调起dialog。

但是在调试过程中发现,应用进入后台或者被杀死后,Service是无法调起dialog的。期间也尝试用ActivityDialog的方式,但是也无济于事。

最终在设置中发现了悬浮窗权限,设为允许后可以正常弹出,至此发现问题原因。

解决:

因为在Android中是没有悬浮窗权限的系统级的授权弹框,所以我们就要想办法在代码中设置。

通过分析settings源码,最终提取了以下两个方法用户查询和设置悬浮窗权限。

1.在AndroidManifest中添加权限

   <uses-permission android:name="android.permission.GET_APP_OPS_STATS" /><uses-permission android:name="android.permission.MANAGE_APP_OPS_MODES" /><uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW"/>

2.查询有无权限

private static final int APP_OPS_OP_CODE = AppOpsManager.OP_SYSTEM_ALERT_WINDOW;
public static final int[] APP_OPS_OP_CODES = {APP_OPS_OP_CODE,};public static boolean checkSystemAlertWindowAllowed(Context context){String packageName = "com.xxx.xxx";PackageInfo packageInfo = null;int appOpMode = -1;try {packageInfo = context.getPackageManager().getPackageInfoAsUser(packageName,PackageManager.MATCH_DISABLED_COMPONENTS |PackageManager.GET_SIGNING_CERTIFICATES |PackageManager.GET_PERMISSIONS, UserHandle.myUserId());} catch (PackageManager.NameNotFoundException e) {e.printStackTrace();}if (packageInfo != null){AppOpsManager appOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);final List<AppOpsManager.PackageOps> packageOps = appOpsManager.getPackagesForOps(APP_OPS_OP_CODES);final int packageOpsCount = packageOps != null ? packageOps.size() : 0;for (int i = 0; i < packageOpsCount; i++) {final AppOpsManager.PackageOps packageOp = packageOps.get(i);if (TextUtils.equals(packageName,packageOp.getPackageName())){appOpMode = packageOp.getOps().get(0).getMode();}}}return appOpMode == AppOpsManager.MODE_ALLOWED;}

3.设置悬浮窗权限

 public static void setSystemAlertWindowAllowed(Context context) {String packageName = "com.xxx.xxx";PackageInfo packageInfo = null;try {packageInfo = context.getPackageManager().getPackageInfoAsUser(packageName,PackageManager.MATCH_DISABLED_COMPONENTS |PackageManager.GET_SIGNING_CERTIFICATES |PackageManager.GET_PERMISSIONS, UserHandle.myUserId());} catch (PackageManager.NameNotFoundException e) {e.printStackTrace();}/*AppOpsManager.MODE_ALLOWED 允许AppOpsManager.MODE_DEFAULT 禁止*/if (packageInfo != null){AppOpsManager appOpsManager = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);appOpsManager.setMode(AppOpsManager.OP_SYSTEM_ALERT_WINDOW,packageInfo.applicationInfo.uid, packageName, AppOpsManager.MODE_ALLOWED);}}

备注:

因为公司项目是系统级的升级,优先级高,所以是在用户不知情的情况下将权限设为允许。

希望各位朋友尊重用户权限,根据自己项目展示出合理的交互,让用户自己授权!!!

Android 查询及设置悬浮窗权限(AppOpsManager )相关推荐

  1. Android各版本查询和开启悬浮窗权限

    Android 各版本查询和开启悬浮窗权限 如果你是从事Android开发的程序员,那么你肯定对于权限这个词不会陌生,Android的权限分为一般权限和危险权限,一般权限(只需在AndroidMani ...

  2. 华为Android 8.0以上悬浮窗权限正确开启方式

    目前市面各种主流Android手机的悬浮窗权限总结代码 不想看继续看的,直接copy代码,拿走吧! 下面简单说一下,我在开发中遇到一个关于华为8.0手机悬浮窗的奇葩问题: 开发中在android 8. ...

  3. Android悬浮窗适配全机型,包含8.0,小米魅族华为悬浮窗权限适配demo看这一篇就够了

    机型多杂,适配无法完全兼容,不如换种实现方式,性能比悬浮窗好,不需要权限,效果更好:https://blog.csdn.net/m0_38058826/article/details/10399339 ...

  4. android适配华为m5,2019-05-29 Android悬浮窗适配全机型,包含8.0,小米魅族华为悬浮窗权限适配demo看这一篇就够了...

    兼容8.0,小米,魅族,华为等难适配机型都可完美适配. 悬浮窗插入接口 在实现悬浮窗之前,我们需要知道通过什么接口,能够将一个控件放入到屏幕中去. Android的界面绘制,都是通过WindowMan ...

  5. iapp调用java顶部显示界面_iapp 悬浮窗权限

    判断有没有悬浮窗权限,没有就跳转到权限设置界面 可以放到myu模块里面调用 对于一些必须要有悬浮窗权限才能实现的功能 //判断悬浮窗权限 java(uxfqx,null,"android.p ...

  6. iapp悬浮窗权限代码

    iapp判断有没有悬浮窗权限,没有就跳转到权限设置界面. 当然也可以放到myu模块里面调用. 对于一些必须要有悬浮窗权限才能实现的功能 iapp代码如下 //判断悬浮窗权限 java(uxfqx,nu ...

  7. Android 悬浮窗权限 及设置悬浮窗参数

    在 4.4~5.1.1 版本之间,和 6.0~最新版本之间的适配方法是不一样的,之前的版本由于 google 并没有对这个权限进行单独处理,所以是各家手机厂商根据需要定制的,所以每个权限的授权界面都各 ...

  8. Android 悬浮窗权限各机型各系统适配大全(总结)

    原文链接:点击打开链接 ======================================================================================== ...

  9. Android 悬浮窗权限各机型各系统适配大全

    这篇博客主要介绍的是 Android 主流各种机型和各种版本的悬浮窗权限适配,但是由于碎片化的问题,所以在适配方面也无法做到完全的主流机型适配,这个需要大家的一起努力,这个博客的名字永远都是一个将来时 ...

最新文章

  1. ondblog 修改informix日志模式
  2. Windows 技术篇-windows家庭版win+R运行搜不到gpedit.msc组策略编辑器解决方法,windows安装组策略编辑器方法
  3. c语言用指针带出局部变量,关于C语言中返回局部变量和局部指针变量
  4. 主板怎么开启csm_华擎Z490主板移植AMD SAM加速技术:游戏性能提升最多11.5%
  5. javaweb项目部署到tomcat之后java文件没有编译
  6. 在阿里云Kubernetes上运行SpringCloud示例PiggyMetrics
  7. CodeForces - 1267A Apprentice Learning Trajectory(贪心)
  8. Cmder - 在右键菜单添加Cmder Here
  9. AVFoundation – AVAsset 加载媒体
  10. nagios安装配置pnp4nagios-0.6.6
  11. FPGA之VGA控制
  12. picgo图片上传踩坑
  13. 值得推荐的几款卸载软件工具
  14. 手机突然黑屏是什么原因
  15. Java hashCode详解
  16. Qt QPlainTextEdit和QTextEdit区别
  17. 利用ipv6技术,废旧笔记本变成互联网server
  18. 搜狗输入法导入本地txt为个人词库
  19. sup 元素的使用
  20. 让信息跨过高山大海,送达人山人海,奈何光纤损耗太大

热门文章

  1. Hive函数05_细说CAST函数(数据类型转化)
  2. 基于Sring+bootstrap+MySQL的住房公积金管理系统
  3. adobe CC 2015/2017安装失败
  4. layui数据表格的使用(前端和后端)
  5. JAVA后台数据使用thymeleaf渲染html页面
  6. Scrapy框架的基本使用
  7. 玩儿《阴阳师》的体验
  8. 哪种便签应用能支持导出?
  9. ajax用jquery怎么实现,ajax使用jquery的实现方式
  10. 谷歌浏览器清除缓存-Ctrl+Shift+Delete