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

智能推荐

Python urllib 入门使用(步骤详细)_urllib教程-程序员宅基地

文章浏览阅读1.3k次。urllib库,它是Python内置的HTTP`request` 请求模块,提供最基本的 `HTTP` 请求处理。`parse` 工具模块,提供处理 `url` 的很多方法:拆分、解析、合并等等。`error` 异常处理模块,如果出现请求错误,可以捕获这些错误,保证程序不会意外终止。`robotparser` 模块,主要用来识别网站的 `robots.txt` 文件,判断哪些网站可以爬取,用的比较少。# 使用 urllib# url 的组成wd=123# 协议 主机 端口号 路径 参数 锚点。_urllib教程

同时配置多个Tomcat的环境变量_环境变量配置多个tomcat-程序员宅基地

文章浏览阅读2k次。装两个tomcat 分别是6.0和7.0 可想运行tomcat6.0 但是实际上却运行tomcat7.0 两个版本都是用解压缩包 其实就是不能运行tomcat6.0 只能运行7.0 两个环境变量都配置了。端口也改了 还是不行我遇到这种情况了,不知大家遇到没有,如下是我的解决方法:当第一个tomcat启动后,后面tomcat的server.xml中的端口不管怎么改,仍然会报端口冲突。..._环境变量配置多个tomcat

14、Android Studio通过http向C++服务端传递base64图片,然后对图片处理(写入本地)返回数据给Android studio_android studio 数据库上传图片-程序员宅基地

文章浏览阅读3.3k次,点赞2次,收藏6次。基本思想:最近做了一个项目需要使用将android studio 中抓取的视频帧和一些数据上传服务器处理,然后将处理结果返回给android studio 手机端一、因为不太会写通信,着实补充了一些知识,还是不会写,尴尬了,找到了一个轻量级的项目,参考附录一,稍微修改了一下,使用rapidjson作为json的客户端数据传递和服务端数据解析现在window11 上使用clion简单测试一下,放一下目录和贴一下cmakelist.txt即可cmakelists.txt (客户端)cmake__android studio 数据库上传图片

强化学习的学习之路(二十三)_2021-01-23:Distributional DQN:A Distributional Perspective on Reinforcement Learning-程序员宅基地

文章浏览阅读856次,点赞3次,收藏15次。作为一个新手,写这个教程也是想和大家分享一下自己学习强化学习的心路历程,希望对大家能有所帮助。这个系列后面会不断更新,希望自己能保证起码平均一天一更的速度,先是介绍强化学习的一些基础知识,后面介绍强化学习的相关论文。本来是想每一篇多更新一点内容的,后面想着大家看CSDN的话可能还是喜欢短一点的文章,就把很多拆分开来了,目录我单独放在一篇单独的博客里面了。完整的我整理好了会放在github上,大家一起互相学习啊!可能会有很多错漏,希望大家批评指正!接下来的几个博客将会分享以下有关DQN算法及其改进,包括DQ_distributional dqn

六个创建型模式5: 原型模式-Prototype Pattern【学习难度:★★★☆☆,使用频率:★★★☆☆】_范式 创建 原型 骇客-程序员宅基地

文章浏览阅读351次。动机就是复制克隆原型模式(Prototype Pattern):使用原型实例指定创建对象的种类,并且通过拷贝这些原型创建新的对象。原型模式是一种对象创建型模式。原型模式的工作原理很简单:将一个原型对象传给那个要发动创建的对象,这个要发动创建的对象通过请求原型对象拷贝自己来实现创建过程。由于在软件系统中我们经常会遇到需要创建多个相同或者相似对象的情况,因此原型模式在真实开发中的使用频率还是_范式 创建 原型 骇客

struts2+quartz定时任务_struts2 +quartz-程序员宅基地

文章浏览阅读5.6k次。最近有需求要写一个定时任务 目的是更新一些员工/人员与部门之间的关系 项目用的是struts2 当我加了spring的jar包之后写了一个定时任务 项目经理不让用spring 就修改一下 这次贴个全的 下面是任务类package com.timetask.action;import java.io.BufferedWriter;import java.io.File;import java...._struts2 +quartz

随便推点

Kaggle 数据挖掘比赛经验分享(转)-程序员宅基地

文章浏览阅读68次。原作者:陈成龙简介Kaggle于2010年创立,专注数据科学,机器学习竞赛的举办,是全球最大的数据科学社区和数据竞赛平台。笔者从2013年开始,陆续参加了多场Kaggle上面举办的比赛,相继获得了CrowdFlower搜索相关性比赛第一名(1326支队伍)和HomeDepot商品搜索相关性比赛第三名(2125支队伍..._news_recommendation/ctr_prediction/avazu_ctr/train.csv

【架构实践】软件研发的第一性原理_软件行业的第一性原理是什么-程序员宅基地

文章浏览阅读2.3w次,点赞2次,收藏2次。更可行的思路是解决电池的原料问题,因为电池的原材料是相对固定的,这才是最基础的出发点。,正如樊登在其《低风险创业》一书中说,如果创业时钱多不是好事,因为钱多就猛招人、大做广告、买流量等,表面上看,不好的产品销售不错,会给自己错觉,觉得开发出来的产品是好产品,但最后钱烧光了,产品卖不出去了,还要裁人。首先,必须说,这种思考方法非常耗费脑力,因为需要透过现象找到最本质的,最为真实的元素作为基础,在电池的例子中,如果马斯克归因的结果是供应商的问题,说服他们降价,那么不仅会导致关系紧张,也没有办法解决问题。_软件行业的第一性原理是什么

java实验1_java实验1实验报告(20135232王玥)-程序员宅基地

文章浏览阅读138次。实验一 Java开发环境的熟悉一、实验内容1. 使用JDK编译、运行简单的Java程序2.使用Eclipse 编辑、编译、运行、调试Java程序二、实验要求1.没有Linux基础的同学建议先学习《Linux基础入门(新版)》《Vim编辑器》 课程2.完成实验、撰写实验报告,实验报告模板见QQ群,注意实验报告重点是运行结果,遇到的问题(工具查找,安装,使用,程序的编辑,调试,运行等)、解决办法(空洞..._java本次实验的收获,存在的问题与建议

Javascript的优点和缺点_网页中添加javascript的方式及其优缺点-程序员宅基地

文章浏览阅读2.5k次。今天来聊聊Javascript的优缺点.因为是考虑执行速度, 因为解释型语言, JavaScript省掉了编译的步骤, 执行过程更轻量. 执行速度虽然不如c++, 但是因为有了V8引擎的加持, 速度要快过python.其次,Javascript学习和理解起来很简单. 事实上, 它的第一个版本就是为了能在浏览器里, 验证用户在表单输入的内容是否规范. 所以javascript没有像其它语言一样很重的规范和限制, 同时和python一样, 它也是弱类型的动态语言.由于主流的浏览器都支持JavaS.._网页中添加javascript的方式及其优缺点

狗年出生的宝宝取名都有哪些注意事项呢?起名真不是简单事_疫情宝宝出生起名-程序员宅基地

文章浏览阅读473次。很多人以为给孩子起名是件很简单的事情,只需要了解一些比较好的名字就好。其实真的是这样的吗?肯定不是的,为孩子起名也是有很多忌讳的。这不,今天就为大家好好讲讲狗年出生的宝宝取名的一些忌讳吧。一、取名字忌不雅的谐音有些人的名字看起来好像是很高雅的,但是一读起来就有问题了,各种谐音出现的不雅的语句。这样的名字经常会成为其他人的一种玩笑。二、忌讳用过于时髦的字在不同的时期,总是会出现一_疫情宝宝出生起名

sqoop 安装_sudo ./sqoop import --connect jdbc:mysql://127.0.0-程序员宅基地

文章浏览阅读243次。一。挂载U盘指令sudo fdisk -l 查看路径sudo mkdir /u 在/usr/soft 下创建挂载路径sudo mount -t vfat /dev/sdb /usr/soft/u 挂载过去[卸载时用:sudo umount /mnt/u ]二。 复制然后可以图形界面复制或者指令复制sudo cp sqoop-1.2.0-CDH3B4.tar.gz /usr/soft三。解..._sudo ./sqoop import --connect jdbc:mysql://127.0.0.1:3306/test1?usessl=false

推荐文章

热门文章

相关标签