Android 开发者必知必会的权限管理知识

安卓Android源码项目——仓库管理系统源码深入解析 本文还有配套的精品资源,点击获取 简介:本项目是学习和实践安卓应用开发的完整源码,提供仓库管理功能,包括入库、出库、库存盘点等操作。通过这套源码,开发者可以深入理解Android应用的架构、数据库操作和UI实现。项目结构清晰,包括主工程、UI组件、数据存储、模型、适配器、网络请求、权限管理、业务逻辑以及测试等方面,旨在帮助开发者提升实战经验。 1. 安卓应用开发学... 阅读详情

本文来自于腾讯Bugly公众号(weixinBugly),未经作者同意,请勿转载,原文地址:https://mp.weixin.qq.com/s/OQRHEufCUXBA3d3DMZXMKQ

导语

本文主要讲解了Android 权限管理方面几个点:

  1. Android 权限背景知识;
  2. 权限检查及权限兼容;
  3. 跳转到app管理权限页面

一、Android 权限背景知识

提到Android 权限管理,业内人士都知道Google 在Android 6.0时提出了运行时权限管理机制,在Android 6.0之前,所申请的权限只需要在AndroidManifest.xml列举就可以,从而容易导致一些安全隐患,因此,在Android 6.0 时,Google 为了更好的保护用户隐私提出了新的权限管理机制(官网 :Working with System Permissions),同时将其分为两大类:

(1)Normal Permissions

Normal Permissions 一般不涉及用户隐私,是不需要用户进行授权的,比如手机震动、访问网络等;

(2)Dangerous Permission

Dangerous Permission一般是涉及到用户隐私的,需要用户进行授权(动态申请),比如读取SIM卡状态、访问通讯录、SD卡读写等。

通过 adb shell pm list permissions -d -g 可以查看 Dangerous Permission (以权限组形式)

Dangerous Permission group

如上图所示 :Dangerous Permission 一般以 Permission group 形式存在,只要 Permission group中某一个 permission 被Granted,则整个Permission group下的权限均被Granted (目前是这样,以后规则说不定会变)。

二、权限检查及权限兼容

本节主要介绍介绍如何进行权限检查及权限兼容,主要分为以下几类:

(1)targetSdkVersion>=23,终端设备是6.0(api 23)以上系统;

安装的时候不会获得权限,在运行时向用户申请对应权限。这部分权限检查比较简单,不涉及权限兼容,使用官方方案就可以 ,使用 Context::checkSelfPermisson ,建议使用ContextCompat::checkSelfPermisson检查权限 即可 ,一般检查流程 如下:

  1. 判断是否有对应权限
    (ContextCompat::checkSelfPermisson)

  2. 判断是否需要解释对应权限用途(ActivityCompat::shouldShowRequestPermissionRationale)
    如果需要解释,则现实自定义权限界面即可

  3. 不需要解释的话,直接请求对应权限
    (ActivityCompat::requestPermissions)

上述情况较为简单,在此不再赘述。

(2)targetSdkVersion<23,终端设备是6.0(api 23)以上系统;

使用的是老的权限机制,在app 安装时会询问AndroidManifest.xml文件中的权限,但是用户可以在设置列表中关闭相关权限,这种情况可能会对app正常运行造成一定影响。

(3) 终端设备系统小于6.0(api 23)

大家可能要问,终端设备系统小于6.0情况还需要考虑吗,肯定是用的老的权限管理机制,在app 安装时会询问AndroidManifest.xml文件中的权限,用户关闭不了,真的是这样吗 ?

答案是否定的,在实测中发现,目前有不少国产Rom 手机在6.0之前就有关闭权限的开关。这种情况也是我们兼容的对象。

下面将会以自己开发过程中遇到的问题进行展开 ,目前企鹅FM支持免流了,需要使用READ_PHONE_STATE权限 (读取SIM卡状态),由于之前未对改权限是否关闭没有进行相关判断,因此收到了很多例因为上述权限关闭,导致免流失败的情况。

适配过程如下 :

(1)使用 try catch 来检查权限是否关闭

想法很简单,如果改权限被用户禁止了,那肯定会异常,因此可以在catch 中做文章,结果发现这一招根本没有用,为啥了 ?因为使用 READ_PHONE_STATE 权限的方法内部已经try catch ,外面无法捕获,因此该方法失效。

(2)ContextCompat::checkSelfPermisson

既然在6.0 可以使用Context::checkSelfPermisson进行权限检查,那能否使用support v4 中的ContextCompat::checkSelfPermisson 方法了,试一下,发现在api 23 以下失效,为了探究原因,查看了ActivityCompat::requestPermissons 内部实现,如下

ActivityCompat::requestPermissons

内部权限检查方法在api 23 以下,使用的是 PackageManager::checkPermission,再去查看PackageManager::checkPermission方法,如下:发现只要权限在AndroidManifest.xml中注册过,均会认为该权限granted ,因此上述方法在api 23 以下也失效。

PackageManager::checkPermission

查阅相关资料和请教组内同事,发现Support V4 下面有一个专门检查权限的工具类PermissionChecker。

(3)PermissionChecker

查看PermissionChecker源码发现 ,PermissionChecker内部实际上使用的是AppOpsManagerCompt,而AppOpsManager是在api 19 加入进入的(AppOpsManager后面介绍)

PermissionChecker::checkPermission

进而查看AppOpsManagerCompat 内部实现

AppOpsManagerCompat::permissionToOp

IMPL实现如下:

IMPL实现

从上图可以看出:在api 23以下, AppOpsManagerImpl::permissionToOp 直接返回为null ,这直接导致api 23以下权限检查将会返回 granted ,因此,该方法在api 23 下,权限检查方法也会失效。

(4)AppOpsManager

API 19以上 ,Google 官方提供了 AppOpsManager 类来检查权限,看到这个api 时,脑海浮现出 “天无绝人之路啊”,里面有两个比较重要的方法 :AppOpsManager::checkOp(int op ,int uid ,String packageName) (hide方法)和AppOpsManager::checkOp(String op,int uid ,String packageName)(public 方法 ,api 23 以上可用),不经思考,直接写出了如下两个方法

1)AppOpsManager::checkOp(int op ,int uid ,String packageName)

需要使用反射 :

AppOpsManager::checkOp(int op ,int uid ,String packageName)

2)AppOpsManager::checkOp(String op,int uid ,String packageName)

API >= 23 才可以使用 :

AppOpsManager::checkOp(String op,int uid ,String packageName)

在实测中发现,api 低于23时 ,OP_READ_PHONE_STATE =51 找不到,导致反射失败。

仔细察看了一下 6.0 (API 23 )_NUM_OP = 62,如下,为何找不到51 了

6.0 (API 23 )_NUM_OP = 62

难不成 每个版本还不一样,查看其他版本,验证了这个想法:

5.1.1 (API 22 )_NUM_OP = 48

5.1.1

Op个数限制 (需要找到对应源码说明**)详情 参看 :

查看Android 对应版本 _NUM_OP (目前最高支持5.1.1版本)

此时,OP_READ_PHONE_STATE = 51 在6.0(API 23)以下,通过反射是找不到的,因此对于READ_PHONE_STATE权限检查仅限于6.0及6.0以上。

同时也仔细看了一下AppOpsManager 类介绍,并不是为开发者设计的,不过其他权限兼容可以使用这种方法,前提是 要看OP_*是在什么版本才有的,需做兼容方案 。

public class AppOpsManager

extends Object

API for interacting with “application operation” tracking.

This API is not generally intended for third party application developers; most features are only available to system applications. Obtain an instance of it through Context.getSystemService with Context.APP_OPS_SERVICE.

(5)最后查看了几个第三方权限库(暂未看完)

  1. PermissionsDispatcher

  2. AndPermission

三、跳转到app管理权限页面

既然在这里讲解跳转到app 管理权限页面的方法,可想而之,事情绝对不太简单。Android 碎片化不仅在存在于ui适配 ,同样也存在于这里,导致我们无法使用同一种方式跳转到app管理权限页面(适配,Android 开发永远的痛)。

那有没有办法可以简化适配工作,减少开发量,方法当然有,不过需要我们自己去总结和探索的,目前已有方法:

(1)直接跳转到系统设置页

Intent intent =newIntent();
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
intent.setAction(Settings.ACTION_APPLICATION_DETAILS_SETTINGS);
intent.setData(Uri.fromParts("package",getPackageName(), null));

try{
    startActivity(intent);
}catch(Exception exception) {
    exception.printStackTrace();
}

记得要添加上 try catch ,不加可能会crash。这种方式就不需要适配各个厂商的不同版本rom,缺点是,用户只能跳转到系统设置页,然后去找对应app 的权限管理(总会有一些用户找不到)

(2)站在前人的肩上

引用前人经验:Android各大手机品牌手机跳转到权限管理界面 (未一一验证,毕竟没那么多手机)

那是不是前人经验一定对了,那就不一定了,在当时可能是对的,在现在可能就行不通了,现在以MIUI跳转到app 权限管理页面为例进行说明。

1)MIUI 6/7

Intent localIntent = new Intent("miui.intent.action.APP_PERM_EDITOR");
localIntent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.AppPermissionsEditorActivity");
localIntent.putExtra("extra_pkgname", context.getPackageName());

try{
    startActivity(intent);
}catch(Exception exception) {
    exception.printStackTrace();
}

2)MIUI 8

Intent localIntent = new Intent("miui.intent.action.APP_PERM_EDITOR");
localIntent.setClassName("com.miui.securitycenter", "com.miui.permcenter.permissions.PermissionsEditorActivity");
localIntent.putExtra("extra_pkgname", context.getPackageName());

try{
    startActivity(intent);
}catch(Exception exception) {
    exception.printStackTrace();
}

对比1)和2)发现,在MIUI 6/7 和MIUI 8 上面,权限管理页面的activity名字不一样了,因此使用MIUI6/7的方法在MIUI8上就会失效,如果没有加上try catch ,就会直接crash。

对于上述变化,作为一个开发者一般都是不知道的,即便通过反馈发现了这个问题,也有可能不知道对应的activity是什么,此刻要么搜索网上有没有类似解决方案,要么求助于对应rom 开发厂商的开发者论坛 (有时解决回应速度相当慢),那有没有更好的办法了,方法详见(3)部分。

(3)查看某个ROM的某个版本的权限管理页面的activity

这里以华为p8为例简要说明,详细步骤如下:

1)通过设置找到对应app的权限管理页面,如下:

企鹅fm在华为p8上的权限管理页面

2)找到对应页面的activity

方法一:通过add 工具查看栈顶Activity

adb shell dumpsys activity | grep "mFocusedActivity"  

企鹅fm在华为p8上的权限管理页面对应的activity

更为详细的堆栈信息

详细的堆栈信息

方法二:使用Activity Tracer工具

使用方法:可参见我之前的文章 :Android开发—— 小工具,大效率

使用Activity Tracer查看权限管理页面对应的activity

文中引用链接:
1. Working with System Permissions
https://developer.android.com/training/permissions/index.html
2. 查看Android 对应版本 _NUM_OP
http://grepcode.com/search?query=android.app.AppOpsManager&n=
3. PermissionsDispatcher
https://github.com/hotchemi/PermissionsDispatcher
4. AndPermission
https://github.com/yanzhenjie/AndPermission
5. Android各大手机品牌手机跳转到权限管理界面
http://www.jianshu.com/p/b5c494dba0bc
6. Android开发—— 小工具,大效率
http://www.jianshu.com/p/672d64fdc486


更多精彩内容欢迎关注腾讯 Bugly的微信公众账号:

腾讯 Bugly是一款专为移动开发者打造的质量监控工具,帮助开发者快速,便捷的定位线上应用崩溃的情况以及解决方案。智能合并功能帮助开发同学把每天上报的数千条 Crash 根据根因合并分类,每日日报会列出影响用户数最多的崩溃,精准定位功能帮助开发同学定位到出问题的代码行,实时上报可以在发布后快速的了解应用的质量情况,适配最新的 iOS, Android 官方操作系统,鹅厂的工程师都在使用,快来加入我们吧!

无需Root权限的安卓应用权限管理与操作指南 在进行应用权限管理时,重要的是找到应用功能需求与隐私保护之间的平衡点。用户的隐私意识逐渐提高,对于权限的管理也越来越细致。通过 App Ops + Shizuku + ADB 的方案,即使在非 root 环境下,也能实现较为有效的权限控制。然而,这需要用户有一定的技术知识,并在使用过程中不断学习和总结。通过本章内容,用户应当能够理解非 root 环境下进行应用权限管理的必要性和可行性,掌握使用 App Ops、Shizuku 和 ADB 的基本方法,并通过实际案例进一步加深理解。 阅读详情

相关推荐

霍尔安装歪了也能用?揭秘无感FOC中的‘霍尔自学习’黑科技,实现信号线自适应

本文揭秘了无感FOC中的‘霍尔自学习’黑科技,即使霍尔安装歪了或信号线接错,电机仍能平稳运转。该技术通过算法创新解决了传统霍尔方案的安装公差、接线容错和校准成本问题,显著提升了电机控制的可靠性和效率。文章详细解析了自学习算法的实现架构、关键技术及工程实践中的优化方案,展示了其在工业应用中的卓越性能。

weixin_28309571的博客 463

Android 运行时权限详解

Android系统权限 Android 是一个权限分隔的操作系统,其中每个应用都有其独特的系统标识(Linux 用户 ID 和组 ID)。系统各部分也分隔为不同的标识。Linux 据此将不同的应用以及应用与系统分隔开来。在默认情况下任何应用都没有权限执行对其他应用、操作系统或用户有不利影响的任何操作。包括读取或写入用户的私有数据(例如联系人或电子邮件)、读取或写入其他应用程序的文件、执行网络访问...

weixin_34239169的博客 757

基于WEKWS模型的语音唤醒关键词识别

本文所使用的模型网络结构继承自论文《Compact Feedforward Sequential Memory Networks for Small-footprint Keyword Spotting》,文中研究了将低秩矩阵分解与传统FSMN相结合的紧凑型前馈顺序记忆网络(cFSMN)用于远场关键字检测任务。

YuZhou的博客 6596

Apk的几种安装方式

一、如何将带源码的APK预置进系统 在 packages/apps 下面以需要预置的 APK的 名字创建一个新文件夹,以预置一个名为Test的APK 为例 将 Test APK的Source code 拷贝到 Test 文件夹下,删除 /bin 和 /gen 目录 在 Test 目录下创建一个名为 Android.mk的文件,内容如下: LOCAL_PATH:= (callmy−dir)i...

alianqiugui的博客 2492

SIPVicious实战指南:从零开始掌握VoIP渗透测试(Kali Linux环境)

本文为SIPVicious实战指南,详细介绍了在Kali Linux环境下进行VoIP渗透测试的完整流程。从环境准备与工具安装开始,逐步讲解如何使用svmap扫描SIP服务器、svwar枚举PBX分机号,以及svcrack进行密码安全测试,并整合svreport生成报告。旨在帮助安全从业者从零开始,系统掌握这套经典开源工具,在授权范围内有效评估VoIP系统的安全性。

weixin_29327977的博客 537

【WILEY】wiley期刊投稿详解:从revision到Accepted全流程实例讲解

注意:包括没标注修改位置的word文件和标注了修改位置的word文件。

Everyday try to become better -Kobe Bryant 1万+

Android 中高级面试必知必会

属性动画、补间动画、帧动画的区别和使用场景。

2501_90194374的博客 898

手把手教你用Simulink搭建级联H桥储能变流器仿真模型(附SOC均衡分析)

本文详细介绍了如何使用Simulink搭建级联H桥储能变流器仿真模型,并附有SOC均衡分析。从仿真环境准备、单相H桥单元建模到多模块级联方案和SOC均衡策略实现,逐步指导读者完成复杂系统的构建与优化。通过关键仿真结果分析和工程实践问题排查,帮助读者掌握级联H桥储能变流器的核心技术与应用方法。

weixin_42524226的博客 445

Android中自动跳转到系统设置界面

Android中自动跳转到系统设置界面   2014-01-24 17:50:48|  分类: Android |  标签:android  settings  开发者模式  |举报|字号 订阅 相关的API android.provider.Settings。 1.   ACTION_ACCESSIBILITY_SETTINGS :    // 跳

鲲鹏望舒 1094

解决com.kingbase8.util.KSQLException: This _connection has been closed.

一个消息管理系统,系统采用kingbase8数据库,数据库采用单体模式,后台应用也采用springboot单体模式。系统正式上线后,出现几个JDBC响应的异常信息: com.kingbase8.util.KSQLException: An I/O error occurred while sending to the backend. java.net.SocketTimeoutException: Read timed out.

qq_38127559的博客 2756

南京邮电大学电工电子实验(二)复习一

本文给电工电子实验(二)的复习进行一些知识点的提醒

YOUXISUN的博客 2958

Android权限管理

Android权限管理(PermissionsDispatcher框架使用)简述一、Android权限二、6.0以上权限管理 简述 由于对于安全考虑,Android对于权限的管理更加的严谨,以6.0位界分为两种处理方式:6.0以下系统还是保持旧的处理方式,直接在AndroidManifest清单中注册相应权限就可以;6.0以上系统就需要根据权限的等级(普通权限和危险权限)进行权限注册,如果是普通权...

zengruiyue的博客 1万+

SAN存储与协议,了解SCSI、FC和ISCSI

在前面我们介绍SAN存储及iSCSI协议的时候了解到SAN存储其实是一个CS架构的系统。存储系统本身就是整个系统的服务端。以IP-SAN(也就是基于iSCSI的SAN存储)为例,其整体架构如图1所示。 图1 CS架构 对于存储系统来说,通常是由专业的存储厂商提供,比较知名的如EMC、NetAPP、IBM和日立等等。国内存储厂商也迅速崛起,比较知名的如华为、宏杉、浪潮和同友等等。另外,还有一些小的存储厂商,他们往往集中在某个领域,比如专注文件系统或者块存储等等。 除了专业的存储设备外,其实Linux

shuningzhang的专栏 2685

每个安卓APP开发者都应该知道的基础知识

这里简单地介绍一下每个安卓APP开发者都应该知道的基础知识。

红孩儿编程大师 1023

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版

Part-E1-SDIO-Specification-Ver4.00-Final-120220.pdf:最新的sdio 4.0 spec 协议标准 带书签 高清完整PDF版,包括SDIO 接口的外设,SDIO 接口官方协议等。

Android 应用权限管理详解

Android 应用权限管理是一个动态演进的系统,结合了静态权限声明、动态权限请求、分区存储模型、背景权限控制、SELinux 强制访问控制和沙箱隔离等多层次机制。结束语Flutter是一个由Google开发的开源UI工具包,它可以让您在不同平台上创建高质量、美观的应用程序,而无需编写大量平台特定的代码。我将学习和深入研究Flutter的方方面面。从基础知识到高级技巧,从UI设计到性能优化,欢饮关注一起讨论学习,共同进入Flutter的精彩世界!

江上清风山间明月的博客 5467

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

Android中的权限管理机制

Android权限管理机制是保护用户隐私和数据安全的重要机制。通过对应用程序的权限进行管理和控制,可以防止恶意应用程序获取用户的隐私信息,减少对用户隐私的侵犯。同时,权限管理还可以提高应用程序的安全性,防止恶意应用程序对系统进行攻击。在Android应用开发中,开发者应该合理申请和使用权限,遵守Android官方关于权限请求和使用的最佳实践,确保应用程序的合法性和安全性,保护用户的隐私和数据安全。

Good_tea_h的博客 2590

探索Superuser:Android开发者的超级权限管理工具

探索Superuser:Android开发者的超级权限管理工具 在Android开发过程中,获取系统级别的权限常常是必要的,这便是项目的价值所在。这个开源项目由Philipp Husson维护,为开发者提供了一个安全、灵活的方式来控制和管理应用程序对系统的超级权限请求。 项目简介 Superuser是一个Android应用,它允许经过验证的第三方应用在用户批准后获得root权限。换句话说,它是一个...

gitblog_00081的博客 1032

Android权限管理及动态申请权限

Android权限管理 一、基本介绍   Android安全架构规定:默认情况下,任何应用都没有权限执行对其他应用、操作系统或用户有不利影响的任何操作。这包括读写用户的私有数据(如联系人或电子邮件等)、读写其他应用的文件、执行网络访问、使设备保持唤醒状态等等。   应用权限基于系统安全功能,并有助于 Android 支持与用户隐私相关的以下目标: 控制:用户可以控制他们与应用分享的数据。 透明度:用户可以了解应用使用了哪些数据以及应用为何访问相关数据。 数据最小化:应用仅能访问和使用用户调用的特定任务.

weixin_56291477的博客 3万+

android 设置应用权限管理,几种安卓权限管理应用介绍

虽说安卓手机root过后,手机应用就可以使用最高权限来实现很多特殊的功能,但随之而来的就是最高的权限导致手机安全与隐私泄露等问题。所以我们并不能让所有应用都可以使用root权限,如果这样我们的手机会变得非常的不安全。我们需要用权限管理软件来管理权限的授权方式,那些应用可以使用root权限,那些应用不允许其使用root权限,只有这样才能保证手机的安全。因此就产生了权限管理这个概念。现在的市面上有很多...

weixin_36253537的博客 3450

KernelSU安卓Root方案:从内核层面重新定义Android权限管理

你是否曾因Android设备的Root权限管理复杂而苦恼?传统Root方案要么功能单一,要么安全风险高,而KernelSU的出现彻底改变了这一现状。作为一款基于内核的Android Root解决方案,KernelSU不仅提供了强大的权限管理能力,还通过创新的模块化架构和WebUI界面,让系统管理变得前所未有的简单和安全。 ## 三大核心优势:为什么选择KernelSU? ### 内核级权限控制

gitblog_00107的博客 908

几种安卓权限管理应用介绍

虽说安卓手机root过后,手机应用就可以使用最高权限来实现很多特殊的功能,但随之而来的就是最高的权限导致手机安全与隐私泄露等问题。所以我们并不能让所有应用都可以使用root权限,如果这样我们的手机会变得非常的不安全。我们需要用权限管理软件来管理权限的授权方式,那些应用可以使用root权限,那些应用不允许其使用root权限,只有这样才能保证手机的安全。因此就产生了权限管理这个概念。现在的市面上有很多

cnfly8 2060

android 权限管理 apk,android权限管理

当android6.0还没普及的时候,我们对6.0权限兼容性问题很少引起重视。然而MIUI系大部分都升级到6.0以上的时候,我们的apk里权限问题爆发了,具体表现在读取本地相册、拍照程序会崩溃。这也给咱提个醒,对于新发布的android版本,要提前做好兼容性测试。那么本文就带大家了解下安卓权限演变的路程以及如何去应对1. android 两种权限管理方式0x01:全家桶android 6.0以前,...

weixin_33355385的博客 1081
上一篇: 你可能需要为你的 APP 适配 iOS 11
下一篇: iOS App 启动性能优化
腾讯Bugly
博客等级 码龄12年 1875粉丝 201原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值