Android permission 动态申请、授权

Android permission 学习

本篇文章介绍android permission系统,并介绍android 6.0 、7.0、8.0 permission的新特性,包括权限动态申请和授权等。

permission system

Android开发者都知道,我们开发的应用默认是没有任何权限的,我们没有办法联网,没有办法进行外部空间存储(内部空间是可以的),除非我们申请了相应的权限(permission)。

比如,我们在Manifest文件中,加入以下语句,我们就可以在我们的应用中连接到网络。

<uses-permission android:name="android.permission.INTERNET" />
  • 1

那么,android为什么要这么设计呢?笔者认为,这样的设计的最大好处是,由于手机上存储了用户的大量隐秘信息,对于Android的用户来说,每次安装App时,都会提示用户该App拥有什么权限,这样用户对该App就有了大概的认识,该App可能会进行什么操作,会不会窃取我的隐私等(当然,普通的Android用户是没有这个意识的)。

Android将所有的权限分为了两种,一种是Normal,另一种是Dangerous. 关于两者,Developer是这么介绍的,

Normal permissions cover areas where your app needs to access data or resources outside the app’s sandbox, but where there’s very little risk to the user’s privacy or the operation of other apps. For example, permission to set the time zone is a normal permission. If an app declares that it needs a normal permission, the system automatically grants the permission to the app.

总的来说,normal类型的权限会泄露用户的风险会很少,所以Android会默认赋予这些权限。

Dangerous permissions cover areas where the app wants data or resources that involve the user’s private information, or could potentially affect the user’s stored data or the operation of other apps. For example, the ability to read the user’s contacts is a dangerous permission. If an app declares that it needs a dangerous permission, the user has to explicitly grant the permission to the app.

而Dangerous权限是怎样的呢?该类型的权限泄露用户隐私的风险会很大,例如,读取用户的通讯录。 
关于Dangerous类的权限,Developer给出的有, 

权限的赋予

上边介绍了危险权限是要用户的允许才能使用的,

before 6.0

在Android 6.0之前,这些权限的赋予是在用户安装App的时候,用户可以选择赋予该权限,然后安装App,但是如果用户不赋予的话,那么该App就无法安装,这就是所谓的All or Nothing。当然,这是原生系统的特性,据我所知,小米、魅族定制的系统已经可以动态赋予权限。

after 6.0

Android 6.0对该特性进行了修改,毕竟All or Nothing的机制存在较大的弊端,很多用户为了使用该App,就同意了所有权限,并且无法对其进行控制,这样就显得权限的作用并没有显现出来。所以Android 6.0 允许了动态赋予权限。

Developer对其的说明如下,

If the device is running Android 6.0 (API level 23) or higher, and the app’s targetSdkVersion is 23 or higher, the app requests permissions from the user at run-time. The user can revoke the permissions at any time, so the app needs to check whether it has the permissions every time it runs

如果你的设备的Android版本在6.0之上,并且App的目标sdk版本在23之上,那么用户就可以对其权限进行动态赋予。而其他情况下,用户无法动态赋予权限,还是All or Nothing。要不全部赋予,要不就不安装。

那么如何使用该新特性呢?

Check For Permissions

Develper的解释如下,

If your app needs a dangerous permission, you must check whether you have that permission every time you perform an operation that requires that permission. The user is always free to revoke the permission, so even if the app used the camera yesterday, it can’t assume it still has that permission today.

如果我们的应用包括危险权限,那么我们在每次执行对应的操作的时候,就应该检查是否被授予该权限。因为用户可以随时取消App的某个权限,所以我们应该每次都要检查用户是否赋予了该权限。否则,就会崩溃。

该函数的用法如下,

// Assume thisActivity is the current activity
int permissionCheck = ContextCompat.checkSelfPermission(thisActivity,Manifest.permission.WRITE_CALENDAR);
  • 1
  • 2

如果用户赋予了该权限,那么该方法会返回PackageManager.PERMISSION_GRANTED,然后我们就可以继续我们的操作;否则会返回PERMISSION_DENIED。如果返回PERMISSION_DENIED,我们就无法直接进行我们的操作,因为我们没有权限。那么应该怎么办呢?此时,我们应该显式的申请权限。

那么怎么显示的申请权限呢?这就用到下面的函数,

requestPermissions

当我们发现,我们的应用没有被授予某个权限的时候,我们就可以显示的申请。 
一个例子如下,

ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_CONTACTS}, MY_PERMISSIONS_REQUEST_READ_CONTACTS);
  • 1

其中MY_PERMISSIONS_REQUEST_READ_CONTACTS是设置的requestCode,用来区分是申请哪个权限,该函数会弹出一个对话框,询问用户是否授权该权限, 

用户可以选择授权或取消,那么我们如何知道用户的选择呢,这就要求我们重载Acitivity的一个接口,

    @Overridepublic void onRequestPermissionsResult(int requestCode,String permissions[], int[] grantResults) {switch (requestCode) {case MY_PERMISSIONS_REQUEST_READ_CONTACTS: {// If request is cancelled, the result arrays are empty.if (grantResults.length > 0&& grantResults[0] == PackageManager.PERMISSION_GRANTED) {// permission was granted, yay! Do the// contacts-related task you need to do.System.out.println("User granted permission");} else {System.out.println("User didn't grante permission");// permission denied, boo! Disable the// functionality that depends on this permission.}return;}// other 'case' lines to check for other// permissions this app might request}}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

我们根据requestCode来区分申请的权限。当用户选择后,就会回调该接口,我们就可以知道用户的选择,进而执行下一步操作。

文中的例子,可以通过以下方式获得, 
https://github.com/KingPaul/DynamicPermissionDemo

Android 系统(81)---Android permission 动态申请、授权相关推荐

  1. Android系统架构-[Android取经之路]

    摘要:本节主要来讲解Android的系统架构 阅读本文大约需要花费10分钟. 文章首发微信公众号:IngresGe 专注于Android系统级源码分析,Android的平台设计,欢迎关注我,谢谢! 欢 ...

  2. android 服务端技术,移动应用服务器端开发(基于JSP技术)-2017 Android系统构架 Android系统构架.docx...

    Android系统构架 PAGE 1 目 录 TOC \o "1-3" \h \z \u 一.Android系统构架 1 二.Linux内核层 2 三.系统运行库层 3 (一)系统 ...

  3. 【android系统】android系统升级流程分析(二)---update升级包分析

    接下来我们将通过几篇文章来分析update.zip包在具体Android系统升级的过程,来理解Android系统中Recovery模式服务的工作原理.今天让我先来分析下升级包update.zip. 一 ...

  4. 【android系统】android系统升级流程分析(一)---recovery模式中进行update包升级流程分析

    今天我们直接来看下android中具体的升级过程是如何的. 升级流程概述 升级的流程图: 升级流程分析 第一步:升级包获取 升级获取可以通过远程下载,也可直接拷贝到指定目录即可. 第二步:准备升级 然 ...

  5. android log抓取方法,Android系统之Android抓取各种log的方法

    Android系统之Android抓取各种log的方法 2018年11月25日 | 萬仟网移动技术 | 我要评论 android之android抓取各种log的方法 1.logcat (四类log b ...

  6. Android 系统(11)---android 系统权限大全

    收集到的android权限都很实用的(permission)大全 1.android.permission.WRITE_USER_DICTIONARY 允许应用程序向用户词典中写入新词 2.andro ...

  7. Android系统(62)-----Android 7.1 新特性之 Shortcuts 介绍

    Android 7.1 新特性之 Shortcuts 介绍 Android 7.1 允许 App 自定义 Shortcuts,类似 iOS 的 3D touch.通过在桌面长按 App 弹出 Shor ...

  8. android 系统联系人,Android读取系统联系人

    Android manifest中声明权限: public class MainActivity extends AppCompatActivity { ArrayAdapter adapter; L ...

  9. android系统语音合成,android 语音合成报错

    发现了2个问题 第一个貌似是复制离线的资源出错了(已经核对过读写等权限): 12-19 19:54:49.739 32006-32159/com.zhanglf.youxuanz I/NonBlock ...

最新文章

  1. scala学习笔记-过程、lazy值和异常(6)
  2. 大数据构建模块:选择体系结构和开源框架
  3. eclipse发布web项目到tomcat服务器
  4. 91.91p10.space v.php,luogu P1091 合唱队形
  5. tb项目管理实践_项目经理与项目管理整理
  6. 【数据结构与算法】带环单链表查找环的入口算法
  7. 子域名收集常用工具(Layer、subDomainsBrute、sublist3r、dnsenum)
  8. Swift中文教程(十七) 可选链
  9. Tensorflow练习题
  10. 他毕业1年,换了5份工作,为什么失业的总是他?
  11. Javascript:拦截所有AJAX调用,重点处理服务器异常
  12. CentOS 6 和CentOS 7 的区别
  13. 手眼标定(eye in hand)-步骤
  14. AI人工智能服务器安装说明书,AI人工智能电脑配置及服务器双显卡的安装总结...
  15. 常用公差配合表图_常用的机械测量工具竟然这么多?你知道几个?
  16. Antv F2双柱状图和折线图的混合写法
  17. webpack中loader和plugin的区别
  18. html前端页面的字体大小,JQuery 改变页面字体大小的实现代码(实时改变网页字体大小)...
  19. 女生戴蓝牙耳机什么颜色好看?适合女生的高颜值蓝牙耳机
  20. Codeforces Round #708 (Div. 2)B. M-arrays

热门文章

  1. 发一个多CPU中进程与CPU绑定的例子
  2. [C++] - 单例模式 释放资源 析构函数的应用
  3. 带你一文看懂MySqL中的事务与索引
  4. linux虚拟机备份树莓派,为树莓派做系统备份镜像(for Linux #038; Mac),
  5. 【LeetCode】剑指 Offer 31. 栈的压入、弹出序列
  6. SparkStreaming项目(实时统计每个品类被点击的次数)
  7. Tomcat类载入器(转载)
  8. AngularJS + Java---前台网页与后台数据库传递数据 基本结构
  9. 【图论】【启发式搜索】【二分查找】[POJ 3897]Maze Stretching
  10. ios--小结系列六