热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

设备管理器添加androidphone_重新梳理Android权限管理

文章首发在个人公众号:追风记忆,公众号微信号:zhuifengThreadAndroidDeveloper指南中,对Andr

文章首发在个人公众号:追风记忆,公众号微信号:zhuifengThread

Android Developer指南中,对Android安全体系结构的核心有这么一个说法:默认情况下,任何应用程序都无权执行任何会对其他应用程序、操作系统或者用户产生负面影响的操作。这句话其实就很好的诠释了权限管理的意义,即用户才是手中设备的主人,没有用户的允许,设备不可以私自记录用户的通讯录,不可以上传用户的姓名和身份证号,更不可以偷偷地窃取属于用户的高级隐私。但在如今的手机程序中,特别是一些流氓应用,私自获取用户高级权限的现象也不少见。随着Android版本的更新,对于权限这一块也比以往做得更好了。这一次重新梳理权限管理环节,并通过实例展示在Android 6.0版本后的权限处理过程。所以篇幅较长,字,阅读大概需要**分钟。

什么是Android权限?

权限(Permission),顾名思义是一种对信息访问的申请。Android的权限有上百种,例如应用程序尝试调用拨号权限、调用摄像头权限、调用读取短信权限、调用读取通讯录权限等等。对于这些权限,Android将其按照危险等级进行了划分分组,分成如下的三种类别:

  1. 正常权限(PROTECTION_NORMAL):指的是应用程序需要访问的一些数据资源,但并不涉及到用户的隐私或者对其他应用程序无害。例如设置闹钟就是属于正常权限。Android在处理正常权限时并不会提示用户,而用户也没有办法取消这些正常权限
  2. 签名权限(PROTECTION_SIGNATURE):指的是Android在安装时授予应用程序的权限,利用签名权限,两个签名相同的应用程序就可以进行安全的数据共享。
  3. 危险权限(PROTECTION_DANGEROUS ):指的是直接触碰到用户隐私或者影响其他程序操作的权限,对于这一类的权限,Android会以弹窗的方式向用户进行问询,应用程序必须要经过用户的授权后才可以进行相应的行为

以危险权限为例,Android规定了如下的权限必须请求用户的许可。

905bfe94b5aabc2010c0b279ed0dbad8.png

Android危险权限组和部分权限示例

Android权限获取的方式

对于程序中申请的权限,都应该在AndroidManifest.XML文件中进行注册,否则申请的权限将无法发挥作用。下图中的AndroidManifest文件中添加了打电话和摄像头的权限。

5d265062bc72b2f930c6528fadd1c83b.png

注册权限

Android权限获取可以分成两个阶段,在Android 6.0之前,所申请的权限只要在AndroidManifest文件中列举就可以了,并会在程序安装时全部显示在安装页面上,这个过程并不区分权限是否为常规权限还是正常权限。这种方式是造成早期Android系统在隐私性做的不好的直接原因,因为用户在安装应用程序时,很多时候并不会去仔细查看程序弹出的方框到底包含了哪些危险的权限,为了尽快的进入程序首页,一般都会同意全部弹出的权限,这就给了很多流氓程序肆意发挥的入口。下图展示了Android 5.0安装界面的部分危险权限截图。

c1fc77a7f8d42d94772dbad6d2b2a68b.png

Android 5.0 安装界面

Google显然也注意到了这一点,于是在Android 6.0中推出了一种运行时权限管理机制,这种机制对原有的权限处理方式进行了很大程度的改善:应用程序安装后,点开程序时,不再是列出程序申请的所有权限,而是将部分危险权限与应用本身的功能相关联。例如相机应用,只有当用户点击拍照按钮时,系统就会弹出申请摄像头的权限,这种方式将用户的注意力集中到了当下的操作上,使得用户有足够的时间和意愿去判定是否同意程序的权限申请,并且用户随时可以在设置中关掉授予程序的危险权限,从而极大程度上避免了对危险权限的放行,保护了用户的隐私。

Android 6.0之后的运行时权限处理机制很好的解决了危险权限的获取问题,它具有如下的两个行为:

  • 如果应用程序在当前的权限组(一组权限的集合)中没有任何权限,那么在请求权限时,系统会显示该权限组的请求对话框,例如程序请求CALL_PHONE权限,那么Android将弹出CALL权限对话框显示应用希望拨打电话功能。
  • 如果一个权限组中的任意一个权限被授权,那么该权限组中的其他权限都会被Android默认授权。例如上面的CALL_PHONE权限被允许,那么PHONE权限组中的其它权限,例如READ_PHONE_NUMBERS读取电话号码的权限就会默认被授权,并且不会向用户弹框显示权限申请过程。

运行时权限处理机制中的第二点的特性并不被Google推崇,Google认为后续的Android版本中这个特征可能会发生变化,并建议开发者应明确指出所需要的每一个权限。

Android实现权限管理

关于Android权限更详细的介绍可以在官方的Android Developer指南中查阅。重点是如何在实践中学会使用Android权限,后半部分将会以代码和流程图的方式展示Android权限管理。

Android权限处理可以分解为三个部分:

  1. 检查权限:权限是否为危险权限,正常权限会被系统默认允许,危险权限需要用户手动允许,所以我们的权限讨论范围是危险权限的获取,在Android中检查权限是否获取的方法是ContextCompat.checkSelfPermission(),这个方法返回一个int类型的PERMISSION_GRANTED或者PERMISSION_DENIED,一般来说,程序刚申请权限的时候都是处于PERMISSION_DENIED状态,因此需要后续的申请过程。
  2. 请求权限:当权限并没有被允许的情况下,就需要向用户请求处理权限申请,在应用层上则表现为Android系统会弹出一个对话框,提示用户进行操作。
  3. 从代码层面考虑,Android提供了一个requestPermissions()的调用方法来请求相应权限,这个方法接受目标Activity、需要请求授权的权限组和识别权限请求的请求代码作为参数传递,并且它是一个异步的方法,并返回产生的结果。
  4. 处理权限响应:当用户对弹出的权限申请框进行响应后,Android会调用onRequestPermissionsResult()方法,将用户的响应作为参数传递。开发者必须使用@Override声明覆盖这个方法,来确认这个权限是否真的被用户所允许,并进行后续的业务逻辑编写。
6b7213fc3fdcaa34aaaccd05b110a407.png

Android 6.0权限管理

权限获取的一般过程就是遵循上面的三个步骤进行的,但是千万不要忘记了所申请的权限一定要在AndroidManifest.xml中注册,不然就准备尝尝异常抛出铁拳的力量吧。

当然,更清晰明了的是用流程图来展示权限申请和授权的过程。

1b6622560cd8820ef86b3657a75cfd3c.png
单个权限的获取过程

下面以获取打电话的权限为例,通过代码实现的方式来解释这个流程的具体做法。以下面一个Demo的页面为测试对象,只要点击获取电话权限按钮,就会弹出权限提示窗,然后允许该请求,就可以实现跳转到拨号页面进行通话的功能。

cfb4ead7b0f94b1068e8b1d26002b468.png

页面Demo

第一部分是检测权限部分。点击获取电话权限按钮,就会调用程序中的callPermission()这个方法,在callPermission中调用checkSelfPermission的方法进行权限检测,实参是当前的Activity对象和对应的权限,这个方法返回一个int类型的值,其中若权限允许则返回值为0的PERMISSION_GRANTED,否则返回值为-1的PERMISSION_DENIED,当权限已经被允许的情况下,直接调用else语句中的callPhone()方法,意味着直接可以拨打电话了。

当权限检测为未允许的情况下,进入请求权限状态,即if语句中的requestPermissions这个方法,这个方法会创建一个字符串数组,将请求的权限同一放入这个数组中,最后一个参数是一个int类型的requestCode,该值在后续的处理权限中发挥作用,并且这个值不一定取1,只要这个值大于等于0即可。为了方便起见,这里取1作为请求码。

@Override public void onClick(View view) { switch (view.getId()){ case R.id.getCallPermission: Toast.makeText(MainActivity.this, "获取打电话权限



推荐阅读
  • 优化ListView性能
    本文深入探讨了如何通过多种技术手段优化ListView的性能,包括视图复用、ViewHolder模式、分批加载数据、图片优化及内存管理等。这些方法能够显著提升应用的响应速度和用户体验。 ... [详细]
  • 本文将介绍如何编写一些有趣的VBScript脚本,这些脚本可以在朋友之间进行无害的恶作剧。通过简单的代码示例,帮助您了解VBScript的基本语法和功能。 ... [详细]
  • 本文详细介绍了如何在Linux系统上安装和配置Smokeping,以实现对网络链路质量的实时监控。通过详细的步骤和必要的依赖包安装,确保用户能够顺利完成部署并优化其网络性能监控。 ... [详细]
  • 1.如何在运行状态查看源代码?查看函数的源代码,我们通常会使用IDE来完成。比如在PyCharm中,你可以Ctrl+鼠标点击进入函数的源代码。那如果没有IDE呢?当我们想使用一个函 ... [详细]
  • 数据管理权威指南:《DAMA-DMBOK2 数据管理知识体系》
    本书提供了全面的数据管理职能、术语和最佳实践方法的标准行业解释,构建了数据管理的总体框架,为数据管理的发展奠定了坚实的理论基础。适合各类数据管理专业人士和相关领域的从业人员。 ... [详细]
  • DNN Community 和 Professional 版本的主要差异
    本文详细解析了 DotNetNuke (DNN) 的两种主要版本:Community 和 Professional。通过对比两者的功能和附加组件,帮助用户选择最适合其需求的版本。 ... [详细]
  • golang常用库:配置文件解析库/管理工具viper使用
    golang常用库:配置文件解析库管理工具-viper使用-一、viper简介viper配置管理解析库,是由大神SteveFrancia开发,他在google领导着golang的 ... [详细]
  • [论文笔记] Crowdsourcing Translation: Professional Quality from Non-Professionals (ACL, 2011)
    Time:4hoursTimespan:Apr15–May3,2012OmarZaidan,ChrisCallison-Burch:CrowdsourcingTra ... [详细]
  • 本文详细介绍 Go+ 编程语言中的上下文处理机制,涵盖其基本概念、关键方法及应用场景。Go+ 是一门结合了 Go 的高效工程开发特性和 Python 数据科学功能的编程语言。 ... [详细]
  • 本文介绍了如何使用 Spring Boot DevTools 实现应用程序在开发过程中自动重启。这一特性显著提高了开发效率,特别是在集成开发环境(IDE)中工作时,能够提供快速的反馈循环。默认情况下,DevTools 会监控类路径上的文件变化,并根据需要触发应用重启。 ... [详细]
  • 本文探讨了Hive中内部表和外部表的区别及其在HDFS上的路径映射,详细解释了两者的创建、加载及删除操作,并提供了查看表详细信息的方法。通过对比这两种表类型,帮助读者理解如何更好地管理和保护数据。 ... [详细]
  • 本文介绍了在使用Visual Studio 2015进行项目开发时,遇到类向导弹出“异常来自 HRESULT:0x8CE0000B”错误的解决方案。通过具体步骤和实践经验,帮助开发者快速排查并解决问题。 ... [详细]
  • 本文详细介绍了 Dockerfile 的编写方法及其在网络配置中的应用,涵盖基础指令、镜像构建与发布流程,并深入探讨了 Docker 的默认网络、容器互联及自定义网络的实现。 ... [详细]
  • 本文详细介绍了如何使用 Yii2 的 GridView 组件在列表页面实现数据的直接编辑功能。通过具体的代码示例和步骤,帮助开发者快速掌握这一实用技巧。 ... [详细]
  • 360SRC安全应急响应:从漏洞提交到修复的全过程
    本文详细介绍了360SRC平台处理一起关键安全事件的过程,涵盖从漏洞提交、验证、排查到最终修复的各个环节。通过这一案例,展示了360在安全应急响应方面的专业能力和严谨态度。 ... [详细]
author-avatar
Andiry舍甫琴科
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有