Android中代码动态判断是否开启悬浮窗权限和申请悬浮窗权限_andlua悬浮窗权限代码-程序员宅基地

技术标签: Android Studio  android8.0  悬浮窗权限  android6.0  

1.在AndroidManifest.xml中申请权限

<!-- 要获取CompatModeWrapper,首先得在应用程序的AndroidManifest.xml文件中添加权限 -->
    <uses-permission android:name="android.permission.SYSTEM_ALERT_WINDOW" />

2.判断悬浮窗权限是否开启

public static boolean checkFloatPermission(Context context) {
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.KITKAT)
            return true;
        if (Build.VERSION.SDK_INT < Build.VERSION_CODES.M) {
            try {
                Class cls = Class.forName("android.content.Context");
                Field declaredField = cls.getDeclaredField("APP_OPS_SERVICE");
                declaredField.setAccessible(true);
                Object obj = declaredField.get(cls);
                if (!(obj instanceof String)) {
                    return false;
                }
                String str2 = (String) obj;
                obj = cls.getMethod("getSystemService", String.class).invoke(context, str2);
                cls = Class.forName("android.app.AppOpsManager");
                Field declaredField2 = cls.getDeclaredField("MODE_ALLOWED");
                declaredField2.setAccessible(true);
                Method checkOp = cls.getMethod("checkOp", Integer.TYPE, Integer.TYPE, String.class);
                int result = (Integer) checkOp.invoke(obj, 24, Binder.getCallingUid(), context.getPackageName());
                return result == declaredField2.getInt(cls);
            } catch (Exception e) {
                return false;
            }
        } else {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) {
                AppOpsManager appOpsMgr = (AppOpsManager) context.getSystemService(Context.APP_OPS_SERVICE);
                if (appOpsMgr == null)
                    return false;
                int mode = appOpsMgr.checkOpNoThrow("android:system_alert_window", android.os.Process.myUid(), context
                        .getPackageName());
                return mode == AppOpsManager.MODE_ALLOWED || mode == AppOpsManager.MODE_IGNORED;
            } else {
                return Settings.canDrawOverlays(context);
            }
        }
    }

3.使用

String androidSDK = Build.VERSION.SDK;
if(Integer.parseInt(androidSDK)>=23&&!Settings.canDrawOverlays(LoginActivity.this)){
    Intent intent2 = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
    startActivityForResult(intent2,1);
}

@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
   super.onActivityResult(requestCode, resultCode, data);

   if (requestCode == 1){
       if (PermissionUtils.checkFloatPermission(this)){
            System.out.println("悬浮窗权限申请成功...");
       }else{
            System.out.println("悬浮窗权限申请失败...");
            finish();
        }
    }
}

4.同一功能的两种显示效果

第一种:会进入到悬浮窗权限应用列表
使用以下代码,会进入到悬浮窗权限的列表,列表中是手机中需要悬浮窗权限的应用列表,你需要在此列表中找到自己的应用,然后点进去,才可以打开悬浮窗权限
Intent intent2 = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
startActivity(intent2);

第二种:直接进入到自己应用的悬浮窗权限开启界面
使用以下代码,则不会到上述所说的应用列表,而是直接进入到自己应用的悬浮窗权限开启界面
Intent intent = new Intent(Settings.ACTION_MANAGE_OVERLAY_PERMISSION);
intent.setData(Uri.parse("package:" + getPackageName()));
startActivity(intent);


Build.VERSION.SDK_INT>= Build.VERSION_CODES.O//8.0以上,建议用第一种

Build.VERSION.SDK_INT>= Build.VERSION_CODES.M//6.0-8.0,建议用第二种


参考网址:https://blog.csdn.net/eyishion/article/details/82787310

 

 

参考网址:https://blog.csdn.net/lovedou0816/article/details/79253710

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/aidou1314/article/details/88422007

智能推荐

Java基础面试题

Java基础面试题

Linux基础篇之——远程连接工具Finalshell下载、安装和使用_liunx 链接工具-程序员宅基地

文章浏览阅读464次,点赞6次,收藏5次。Linux远程连接工具Finalshell下载、安装和使用FinalShell 是一款由国人开发的 SSH 客户端工具,支持多平台,包括 Windows、Mac OS X 和 Linux。它主要用于一体化服务器管理,提供以下特性:Shell 和 SFTP 同屏显示:您可以同时查看 Shell 终端和 SFTP 文件传输界面,方便管理服务器。命令自动提示:FinalShell 提供命令自动补全功能,让您的命令输入更加简单、便捷。加速功能:软件内置加速功能,提高访问服务器的速度。_liunx 链接工具

(精确度,召回率,真阳性,假阳性)ACC、敏感性、特异性等 ROC指标_真阳性率-程序员宅基地

文章浏览阅读2.5w次,点赞14次,收藏109次。(精确度,召回率,真阳性,假阳性)ACC、敏感性、特异性等 ROC指标,计算原理,依次列出。_真阳性率

Java垃圾回收机制

Java垃圾回收机制

如何判断第三方软件测试公司是否具有资质

通过查看公司资质证书、考察公司规模和团队实力、查看历史案例和客户评价、询问测试流程和方法、考虑保密性和安全性以及比较多个公司的报价和服务,您可以做出明智的选择,为软件项目的成功奠定坚实的基础。一个有资质的软件测试公司通常会拥有相关的行业认证,如CMA/CNAS等,这些认证证明了公司在质量管理、项目管理等方面的实力和能力。了解公司的测试团队,包括团队成员的背景、经验和技术水平。了解公司的规模,包括员工数量、办公环境等,这有助于判断公司的实力和稳定性。比较多个公司的报价和服务,选择性价比高的公司。

音箱一通电就嗡嗡响已修好_多媒体音箱常见故障和解决办法?学习下-程序员宅基地

文章浏览阅读3.5w次。对于大部分的用户来说,在多媒体音箱的使用上都不会有特别的讲究,很多用户由于对产品结构的陌生以及相关知识的缺乏,往往在音箱出现小故障之后也是凑合着用,实在不行再重新换过,事实上多媒体音箱的不少故障修理都非常简单,一般的用户都可以轻松搞定。一、调整音量时出现噼里啪啦的声音,音量时大时小。这是在多媒体音箱身上出现次数最多的故障,相信很多用户都有这样的体会,在使用一段时间后,调节音箱的音量往往会出现这个情..._音箱一通电就嗡嗡响怎么办

随便推点

ES6模块化使用方法_如何用es6模块化项目-程序员宅基地

文章浏览阅读334次。目录结构a.js对外导出对象let name = 'j'let age = 18let sex = 'm'// 导出对象export { name, age}// 默认导出export default sexb.js// 导入a.js中导出对象import {name, age} from './a.js'// 导入a.js中默认导出import sex from './a.js'console.log(name, age, sex)index_如何用es6模块化项目

高中教学分析系统数据可视化探索【可视化实战案例】_对高中教学系统进行可视化分析,-程序员宅基地

文章浏览阅读809次。教育行业中大数据分析的主要目的包括改善学生成绩、服务教务设计、优化学生服务等。而学生成绩中有一系列重要的信息往往被我们常规研究所忽视。通过大数据分析和可视化展示,挖掘重要信息,改善 学生服务,对于教学改进意义重大。美国教育部门构建“学习分析系统”,旨在向教育工作者提供了解学生到底是在怎样学习的更好、更好、更精确信息。利用大数据的分析学习能够向教育工作者提供有用的信息,从而帮助其回答众多不易回答的现实问题。_对高中教学系统进行可视化分析,

【BZOJ】4726 [POI2017] Sabota?_某个公司有n个人, 上下级关系构成了一个有根树。其中有个人是叛徒(这个人不知道是-程序员宅基地

文章浏览阅读362次。【BZOJ】4726 [POI2017] Sabota?Description某个公司有n个人, 上下级关系构成了一个有根树。其中有个人是叛徒(这个人不知道是谁)。_某个公司有n个人, 上下级关系构成了一个有根树。其中有个人是叛徒(这个人不知道是

linux 网卡rss hash,ETHTOOL设置网卡接收哈希(RSS)-程序员宅基地

文章浏览阅读1.9k次。ethtool命令设置接收端哈希功能,按照哈希结果将数据流分发到网卡的不同接收队列中。例如以下命令,指定ipv4的tcp数据流中参与哈希的字段(sdfn):/ # ethtool --config-ntuple eth0 rx-flow-hash tcp4 sdfn同样,使用ethtool命令查看设置结果如下:/ # ethtool --show-ntuple eth0 rx-flow-hash..._网卡hash算法设置

PADS VX 2.7与WIN 10更配哦_pads win10适合安装哪个版本pads-程序员宅基地

文章浏览阅读4.8k次。在WIN 10下之前装的PADS VX2.3,_pads win10适合安装哪个版本pads

unzip实现一次性解压多个文件夹,并且直接覆盖_win7 unzip 多个文件-程序员宅基地

文章浏览阅读7.4k次。最近在实现文件上传的时候,经常需要同一个文件夹上传多个相同路径的情况,就觉着这样很耗时间,特别是网速慢的时候,一个一个去上传,那是非常的慢,于是网上搜寻了一下一次性解压多个文件夹的命令之类的。都不太如意,于是就自己写了一个sh脚本。#!/bin/bash#本sh主要用于unzip解压多个文件夹的命令#事先获取需要解压的文件路径个数echo "正在检索文件夹:$#"#获取压缩的zip文件_win7 unzip 多个文件