Android 查询及设置悬浮窗权限(AppOpsManager )
需求确认:
最近产品在系统升级方面加了一个强制升级的需求,安装完成后需要通过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 )相关推荐
- Android各版本查询和开启悬浮窗权限
Android 各版本查询和开启悬浮窗权限 如果你是从事Android开发的程序员,那么你肯定对于权限这个词不会陌生,Android的权限分为一般权限和危险权限,一般权限(只需在AndroidMani ...
- 华为Android 8.0以上悬浮窗权限正确开启方式
目前市面各种主流Android手机的悬浮窗权限总结代码 不想看继续看的,直接copy代码,拿走吧! 下面简单说一下,我在开发中遇到一个关于华为8.0手机悬浮窗的奇葩问题: 开发中在android 8. ...
- Android悬浮窗适配全机型,包含8.0,小米魅族华为悬浮窗权限适配demo看这一篇就够了
机型多杂,适配无法完全兼容,不如换种实现方式,性能比悬浮窗好,不需要权限,效果更好:https://blog.csdn.net/m0_38058826/article/details/10399339 ...
- android适配华为m5,2019-05-29 Android悬浮窗适配全机型,包含8.0,小米魅族华为悬浮窗权限适配demo看这一篇就够了...
兼容8.0,小米,魅族,华为等难适配机型都可完美适配. 悬浮窗插入接口 在实现悬浮窗之前,我们需要知道通过什么接口,能够将一个控件放入到屏幕中去. Android的界面绘制,都是通过WindowMan ...
- iapp调用java顶部显示界面_iapp 悬浮窗权限
判断有没有悬浮窗权限,没有就跳转到权限设置界面 可以放到myu模块里面调用 对于一些必须要有悬浮窗权限才能实现的功能 //判断悬浮窗权限 java(uxfqx,null,"android.p ...
- iapp悬浮窗权限代码
iapp判断有没有悬浮窗权限,没有就跳转到权限设置界面. 当然也可以放到myu模块里面调用. 对于一些必须要有悬浮窗权限才能实现的功能 iapp代码如下 //判断悬浮窗权限 java(uxfqx,nu ...
- Android 悬浮窗权限 及设置悬浮窗参数
在 4.4~5.1.1 版本之间,和 6.0~最新版本之间的适配方法是不一样的,之前的版本由于 google 并没有对这个权限进行单独处理,所以是各家手机厂商根据需要定制的,所以每个权限的授权界面都各 ...
- Android 悬浮窗权限各机型各系统适配大全(总结)
原文链接:点击打开链接 ======================================================================================== ...
- Android 悬浮窗权限各机型各系统适配大全
这篇博客主要介绍的是 Android 主流各种机型和各种版本的悬浮窗权限适配,但是由于碎片化的问题,所以在适配方面也无法做到完全的主流机型适配,这个需要大家的一起努力,这个博客的名字永远都是一个将来时 ...
最新文章
- ondblog 修改informix日志模式
- Windows 技术篇-windows家庭版win+R运行搜不到gpedit.msc组策略编辑器解决方法,windows安装组策略编辑器方法
- c语言用指针带出局部变量,关于C语言中返回局部变量和局部指针变量
- 主板怎么开启csm_华擎Z490主板移植AMD SAM加速技术:游戏性能提升最多11.5%
- javaweb项目部署到tomcat之后java文件没有编译
- 在阿里云Kubernetes上运行SpringCloud示例PiggyMetrics
- CodeForces - 1267A Apprentice Learning Trajectory(贪心)
- Cmder - 在右键菜单添加Cmder Here
- AVFoundation – AVAsset 加载媒体
- nagios安装配置pnp4nagios-0.6.6
- FPGA之VGA控制
- picgo图片上传踩坑
- 值得推荐的几款卸载软件工具
- 手机突然黑屏是什么原因
- Java hashCode详解
- Qt QPlainTextEdit和QTextEdit区别
- 利用ipv6技术,废旧笔记本变成互联网server
- 搜狗输入法导入本地txt为个人词库
- sup 元素的使用
- 让信息跨过高山大海,送达人山人海,奈何光纤损耗太大