Android权限适配

Android权限适配

动态权限

背景

从Android6.0版本开始google将权限分为普通权限和特殊权限,app必须在AndroidManifest.xml添加引用权限的语句。 在安装apk时安卓会将普通权限授予该app,但特殊权限需要运行时申请。

安卓按照权限类别分为权限组和权限, 每个权限都隶属于一个权限组。 当安卓系统授权一个权限时, 那么该权限所属权限组的权限都会自动被授权。

目前如果app的targetSdkVersion等于21,即按照Android5.0版本特性运行。 技术层面与市场上主流app差距较大, 功能层面也有一些功能可能失效(例如在一些机型上无法打电话、读写SD卡), 根本原因是没适配动态权限。

如何申请动态权限

判断当前手机系统是Android6.0及以上版本, 在Activity/Fragment里申请权限并处理权限结果回调。 这里要说明一下:Fragment是通过Activity申请权限的, 且权限回调onRequestPermissionResult也是Activity调用的Fragment该方法.
在这里插入图片描述

上图是权限申请流程图, 我们看到的权限弹窗对应/packages/apps/PackageInstaller/src/com/android/packageinstaller/permission/ui/GrantPermisssionsActivity.java, 点击“同意”或“不同意”通过PackageManager、AppOpsManager将权限操作更新到PackageManagerService和AppOpsService中。

调用Activity的申请权限方法其实是打开一个系统的Activity,操作结果通过setResult返回过来。

能不能直接调用PackageManager/AppOpsManagerd的方法授权给自己? 显然是不行的, PackageManagerService只允许在AndroidManifest.xml配置coreApp="true"的应用修改权限,而普通app无法设置coreApp属性。

public int getPermissionFlags(String name, String packageName, int userId) {if (!sUserManager.exists(userId)) {return 0;}//普通app调用该方法会抛异常enforceGrantRevokeRuntimePermissionPermissions("getPermissionFlags");enforceCrossUserPermission(Binder.getCallingUid(), userId, true, false,"getPermissionFlags");...
}private void enforceGrantRevokeRuntimePermissionPermissions(String message) {if (mContext.checkCallingOrSelfPermission(Manifest.permission.GRANT_RUNTIME_PERMISSIONS)!= PackageManager.PERMISSION_GRANTED&& mContext.checkCallingOrSelfPermission(Manifest.permission.REVOKE_RUNTIME_PERMISSIONS)!= PackageManager.PERMISSION_GRANTED) {throw new SecurityException(message + " requires "+ Manifest.permission.GRANT_RUNTIME_PERMISSIONS + " or "+ Manifest.permission.REVOKE_RUNTIME_PERMISSIONS);}} 
如何判断权限

在这里插入图片描述

如上图所示,判断是否有权限最终会执行到PackagerManagerService的checkUidPermission函数中。

适配动态权限的方式
  1. 基本用法:在Activity、Fragment派生类中添加权限申请和结果回调。 坑:1、在插件中调用View的getContext返回值是PluginContext, 无法通过类型强转调用其附着Activity/Fragment的方法。2、如果界面层级很深,需要逐层添加回调参数。
  2. AOP方式,推荐https://github.com/permissions-dispatcher/PermissionsDispatcher, 在需要权限的函数上添加注解并在构建阶段注入代码。缺点是app插件中有多View控件如BaseCard无法使用。
  3. 第三方库https://github.com/yanzhenjie/AndPermission, 原理:新启动个透明Activity申请权限并保存回调函数到静态变量里,用户操作权限提示框结束后通过回调执行成功、失败逻辑。

示例代码: 为了避免适配动态权限逻辑产生风险, 可以新增if代码块做动态权限逻辑, else分支仍然是现有逻辑。 各业务线可能无法在同一个版本上搞定, 可以按照这种写法先后完成动态权限适配工作,待所有业务线都完成后调整宿主targetSdkVersion到26。

if (getBaseContext().getApplicationInfo().targetSdkVersion >= Build.VERSION_CODES.M&& Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {AndPermission.with(this).runtime().permission(permissions)// .rationale(new RuntimeRationale()).onGranted(new Action<List<String>>() {@Overridepublic void onAction(List<String> permissions) {toast(R.string.successfully);}}).onDenied(new Action<List<String>>() {@Overridepublic void onAction(@NonNull List<String> permissions) {toast(R.string.failure);if (AndPermission.hasAlwaysDeniedPermission(MainActivity.this,permissions)) {showSettingDialog(MainActivity.this, permissions);}}}).start();
} else {//默认有权限, 用现在的业务逻辑
}
注意事项
  1. 适配小米机型动态权限;
  2. Android7.0版本开始使用FileProvider, 需要适配拍照功能;
  3. 适配DownloadManager安装apk;
  4. 用户禁用权限且不再提醒, 需要有个提示框提示用户去应用详情界面里放开权限, 弹窗建议使用CustomDialog(各业务UI样式统一)。
  5. 适配WindowManager悬浮窗;
附录

官方文档
AndPermission

AndPermission库解决方案

/*** 权限申请其实是startActivityForResult的过程, 弹出的权限提示框是安卓系统应用的GrantPermisssionsActivity.java* 即:申请权限是阻塞的, 在申请权限时当前界面(activity)被GrantPermisssionsActivity盖住了。* 为了实现回调有2种方式:* 1、类似于Glide的做法,在当前activity里添加个空fragment申请权限; 优点是无资源文件,可编译成jar。* 2、新启动个无界面activity申请权限。优点是不限制context类型,缺点是要编译成aar,占位编译只能引用jar,* 打开activity时要依赖链家routerbus。** 参考新房陈少的实现方式修改,即添加fragment申请权限,返回结果后移除fragment* 没处理8.0的2个新增权限,貌似贝壳没用到** 备注:*   只是为了集中管理申请权限逻辑,代码要尽量简单好维护。* 1、没有判断入参权限是否在AndroidManifest.xml中声明,感觉没啥必要* 2、申请权限时没有判断是否已经有这个权限了,考虑实际业务场景没添加。* 3、申请"禁用且不再提醒"的权限时会执行返回deny, 不会弹权限申请框。这时需要引导用户去系统设置放开权限。** 用法:*  LjPermissionUtil.with(MainActivity.this)*             .requestPermissions(Manifest.permission.CAMERA)*             .onCallBack(new LjPermissionUtil.PermissionCallBack() {*               @Override public void onPermissionResult(List<String> granted, List<String> denied) {*                 Log.d("brycegao", "onPermissionResult");*                 if (denied != null && denied.size() > 0) {*                   boolean isAlwayDeny = LjPermissionUtil.isAlwaysDeniedPermission(MainActivity.this,*                       denied.get(0));*                   //这里要弹出个自定义提示框,引用用户去系统设置里放开权限*                   Log.d("brycegao", "");*                 }*               }*             }).begin();*    集成方式*    compileOnly("com.lianjia.common.android:lib_permission:1.0.0-SNAPSHOT") {*     changing = true*   }*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/425095.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【第36章】Spring Cloud之Seata分布式事务

文章目录 前言一、架构图1. 介绍2. 项目结构3. 功能描述 二、用例1. 准备1.1 系统表1.2 业务表1.3 初始化数据 2. 项目搭建2.1 项目结构2.2 主要依赖2.3 主要配置 三、主要业务代码1. 仓储服务1.1 controller1.2 service1.3 dao 2. 订单服务1.1 controller1.2 service1.3 dao 3…

Mac清理其他文件:释放存储空间的高效指南

每个Mac用户都可能遇到存储空间不足的问题&#xff0c;尤其是当“其他”文件积累到一定体积时。在Mac上&#xff0c;“其他”文件通常包括各种系统文件、缓存、文档以及不被归类为应用程序、照片、电影或音乐的其他类型的文件。这些文件往往不易被注意&#xff0c;但逐渐占用了…

【笔记】CCF直播:《如何在国际会议上有效交流》(2024-9-15)

目录 一、提问的勇气二、提问什么三、其他主题的报告为什么听四、会议前怎么读大量论文&#xff1f;五、workshop为什么参加&#xff1f;Poster环节&#xff1f;六、提问环节七、其他 今天听了《如何在国际会议上有效交流》的直播讲座&#xff0c;记录一些笔记。 一、提问的勇…

我又做了一个国标GB28181设备模拟器的Windows版本,让国标28181开发更简单,不用再费劲弄个摄像机来调试国标GB28181开发了

之前我搞过一个《EasyGBD国标GB28181设备端模拟器帮助测试国标GB28181平台&#xff08;EasyGBD-&#xff1e;EasyGBS&#xff09;》&#xff0c;当时&#xff0c;主要是在安卓手机上&#xff0c;用摄像机的本地摄像头来做为视频源、用摄像机的麦克风做为音频源&#xff0c;对外…

微服务网关终极进化:设计模式驱动的性能与可用性优化(四)

时间&#xff1a;2024年09月12日 作者&#xff1a;小蒋聊技术 邮箱&#xff1a;wei_wei10163.com 微信&#xff1a;wei_wei10 希望大家帮个忙&#xff01;如果大家有工作机会&#xff0c;希望帮小蒋推荐一下&#xff0c;小蒋希望遇到一个认真做事的团队&#xff0c;一起努力…

CefSharp_Vue交互(Element UI)_WinFormWeb应用(3)---通过页面锁屏和关机(含示例代码)

一、预览 实现功能:通过vue标题栏按钮锁屏和关机 1.1 预览 1.2 代码 锁屏代码csharp LockWorkStation() 关机代码chsharp 注意vue代码参数和此参数一致(0/1/2) 方法ExitWindowsEx()

python 读取excel

一、安装依赖&#xff1a; pandas 二、新建excel 示例数据&#xff1a;students.xlsx 三、定义类&#xff1a;student.py Student class Student:def __init__(self, name, sex):self.name nameself.sex sexdef show(self):print(f姓名&#xff1a;{self.name} 性别&#…

828华为云征文 | 使用Flexus云服务器X实例部署GLPI资产管理系统

828华为云征文 | 使用Flexus云服务器X实例部署GLPI资产管理系统 1. 部署环境说明2. 部署基础环境2.1. 操作系统基本配置2.2. 部署Nginx2.3. 部署MySQL2.4. 部署PHP 3. 部署GLPI资产管理系统 1. 部署环境说明 本次环境选择使用华为云Flexus云服务器X实例&#xff0c;因为其具有高…

初学Linux(学习笔记)

初学Linux&#xff08;学习笔记&#xff09; 前言 本文跳过了Linux前期的环境准备&#xff0c;直接从知识点和指令开始。 知识点&#xff1a; 1.目录文件夹&#xff08;Windows&#xff09; 2.文件内容属性 3.在Windows当中区分文件类型是通过后缀&#xff0c;而Linux是通过…

【Linux下的cpp】编译调试(gcc、g++、gdb)

【Linux下的cpp】编译调试&#xff08;gcc、g、gdb&#xff09; 文章目录 【Linux下的cpp】编译调试&#xff08;gcc、g、gdb&#xff09;简述gcc、g、gdb编译过程g 编译参数命令行编译演练1、直接编译2、生成库文件并编译链接静态库并生成可执行文件链接动态库生成可执行文件 …

Mistral AI再创新高,Pixtral 12B多模态模型强势来袭

前沿科技速递&#x1f680; 近日&#xff0c;Mistral AI 发布了其首款多模态大模型——Pixtral 12B。作为一款具有语言与视觉处理能力的模型&#xff0c;Pixtral 12B 支持高达10241024像素的图像&#xff0c;具备强大的文本生成、图像理解与生成能力&#xff0c;能够处理复杂的…

Dubbo从入门到实战

Dubbo从入门到实战 1、为什么需要dubbo 很多时候&#xff0c;其实我们使用这个技术的时候&#xff0c;可能都是因为项目需要&#xff0c;所以&#xff0c;我们就用了&#xff0c;但是&#xff0c;至于为什么我们需 要用到这个技术&#xff0c;可能自身并不是很了解的&#x…

【C++STL简介】——我与C++的不解之缘(八)

前言 学过了C的模版&#xff0c;接下来学习C中的STL&#xff08;标准模版库&#xff09;&#xff0c;先来了解一下STL是啥 一、什么是STL STL&#xff08;standard template libaray 标准模版库&#xff09;&#xff1a;是C标准库的重要组成部分&#xff0c;不仅是一个可复用的…

Zookeeper工作机制、特点、数据结构、应用场景、配置参数解读

ZK工作机制 从涉及模式角度来理解&#xff1a;是一个基于观察者模式设计的分布式服务管理框架&#xff0c;负责存储和管理大家都关心的数据&#xff0c;然后接受观察者的注册&#xff0c;一旦这些数据的状态发生变化&#xff0c;zk就负责通知已在zk上注册的那些观察者做出相应…

【FATFS】FATFS简介及下载

1、FATFS简介 FatFs 是一个针对嵌入式系统开发的通用文件系统模块&#xff0c;主要用于支持 FAT 文件系统。它最初由 ChaN 开发&#xff0c;并被广泛应用于嵌入式设备上。FatFs 以其轻量级、可配置和设备无关的特性著称&#xff0c;支持 FAT12、FAT16、FAT32 以及 exFAT 文件系…

Linux:进程状态和优先级

一、进程状态 1.1 操作系统学科&#xff08;运行、阻塞、挂起&#xff09; 为了弄明白正在运行的进程是什么意思&#xff0c;我们需要知道进程的不同状态 大多数操作系统都遵循以下原则 1.1.1 运行状态 因为有一个调度器需要确保CPU的资源被合理使用&#xff0c;所以需要维护…

【AI大模型】ChatGPT模型原理介绍(下)

目录 &#x1f354; GPT-3介绍 1.1 GPT-3模型架构 1.2 GPT-3训练核心思想 1.3 GPT-3数据集 1.4 GPT-3模型的特点 1.5 GPT-3模型总结 &#x1f354; ChatGPT介绍 2.1 ChatGPT原理 2.2 什么是强化学习 2.3 ChatGPT强化学习步骤 2.4 监督调优模型 2.5 训练奖励模型 2.…

【H2O2|全栈】关于CSS(1)CSS基础(一)

目录 CSS基础知识 前言 准备工作 啥是CSS&#xff1f; 如何引用CSS&#xff1f; 选择器 通配符选择器 类名&#xff08;class&#xff09;选择器 id选择器 CSS解析顺序&#xff08;优先级&#xff09; 常见CSS标签&#xff08;一&#xff09; 字体属性 font-style…

SQL Server开启网络访问

目前工作中很少用到SQL Server了&#xff0c;最近需要测试几个表&#xff0c;需要搭建一个SQL Server数据库服务&#xff0c;这里做个总结吧。 安装这里就不做详细介绍了&#xff0c;本文只介绍如何开启SQL Server网络访问。 1、云服务器安全组设置 如果是搭建在云服务器上&a…

[数据集][目标检测]智慧交通铁路异物入侵检测数据集VOC+YOLO格式802张7类别

数据集格式&#xff1a;Pascal VOC格式YOLO格式(不包含分割路径的txt文件&#xff0c;仅仅包含jpg图片以及对应的VOC格式xml文件和yolo格式txt文件) 图片数量(jpg文件个数)&#xff1a;802 标注数量(xml文件个数)&#xff1a;802 标注数量(txt文件个数)&#xff1a;802 标注类别…