Android 6.0 动态权限申请看完就会写

文章目录

  • Android 6.0 动态权限申请看完就会写
    • 1. 起
    • 2. 权限
    • 3. 四个方法
    • 4. 使用
    • 5. 总结

1. 起

Android 的动态权限申请在初学时也是我觉得相对来说比较麻烦的一个点。动态权限申请也并非是从一开始就存在的,而是在 Android 6.0 开始才开始改为动态申请的。

在 6.0 之前只需要在 AndroidManifest.xml 中声明权限即可,当然从 6.0 开始普通权限的获取也只需要这样做就足够,只有部分危险权限才需要搞特殊。

但是稍微总结一下,其实动态权限申请也只需要知道四个方法的用法和意义就可以完全满足基础的使用了,把它们的意义搞明白我觉得是最重要的,思路捋顺了做起来整个流程都显得理所应当了。

2. 权限

先不着急介绍上面提到的四个方法,咱们先从一开始说的普通权限和危险权限来说起,磨刀不误砍柴工。

按 Google 官方文档的说法,权限分为三种:包括安装时权限、运行时权限和特殊权限。

简单讲,安装时权限一般和咱们平时说的普通权限是一回事,在软件安装时就会授予软件该类权限(当然需要已在 AndroidManifest.xml 声明)。

运行时权限就是所谓的危险权限了。这部分权限的申请,除了要在 AndroidManifest.xml 声明之外,还要在运行时动态申请权限。要注意,这里可不能忘记在 xml 文件中声明。

至于最后一个特殊权限我也没看懂,直接引用 Google 文档的原话自己琢磨吧:

特殊权限与特定的应用操作相对应。只有平台和原始设备制造商 (OEM) 可以定义特殊权限。此外,如果平台和 OEM 想要防止有人执行功能特别强大的操作(例如通过其他应用绘图),通常会定义特殊权限。
系统设置中的特殊应用访问权限页面包含一组用户可切换的操作。其中的许多操作都以特殊权限的形式实现。

这里把危险权限列举一下,使用这些权限的时候动态申请就可以了,不在这里面的其他权限直接用就完事了。

权限组名 权限名
CALENDAR READ_CALENDAR,WRITE_CALENDAR
CAMERA CAMERA
CONTACTS READ_CONTACTS,WRITE_CONTACTS,GET_ACCOUNTS
LOCATION ACCESS_FINE_LOCATION,ACCESS_COARSE_LOCATION
MICROPHONE RECORD_AUDIO
PHONE READ_PHONE_STATE,CALL_PHONE, READ_CALL_LOG,WRITE_CALL_LOG,ADD_VOICEMAIL,USE_SIP,PROCESS_OUTGOING_CALLS
SENSORS BODY_SENSORS
SMS SEND_SMS,RECEIVE_SMS,READ_SMS,RECEIVE_WAP_PUSH,RECEIVE_MMS
STORAGE READ_EXTERNAL_STORAGE,WRITE_EXTERNAL_STORAGE

3. 四个方法

ContextCompat.checkSelfPermission

按正常人的思路,申请权限之前应该要先检查是不是已经拥有这个权限。
第一个方法的作用就是检查当前应用是否已经申请到某个危险权限。该方法有两个返回值,如果返回 PackageManager.PERMISSION_GRANTED 则表示已经拥有该权限。若返回 PackageManager.PERMISSION_DENIED 就是未拥有。

ActivityCompat.shouldShowRequestPermissionRationale

执行完第一个方法检查完是否拥有权限后,就可以执行第二个方法。不过这个方法不是必要的,看个人需求,可有可无。
正常情况下这个方法会返回一个 true ,除了两种情况:
一,用户拒绝了权限申请,并且勾选了不再提醒,则该方法返回 false。
二,设备禁止当前应用拥有该权限或是权限未在 AndroidManifest.xml 中声明,则该方法返回 false。
所以我认为该方法的作用就是当用户勾选了不再提醒后,可以有办法去处理,提醒用户进行响应操作手动开启权限。

ActivityCompat.requestPermissions

第三个方法就是真正开始申请想要的权限了,这个看方法名就懂了,不用多说。如果有需要的话第二个方法执行完,判断返回值后进行权限申请即可。不需要的话就跳过第二个方法,第一个方法执行完并判断返回值后直接执行第三个方法。

onRequestPermissionsResult

这是一个复写的方法,复写它并重新根据需求进行实现即可。这个方法的作用是接收第三个方法执行后的返回值,申请成功还是失败可以在这个方法中做对应的处理。下面用代码展示一下这几个方法的用法,直观一点。

4. 使用

  • 先在 xml 文件中声明权限
<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"package="com.apical.kotlinstudy">//声明所需的权限<uses-permission android:name="android.permission.WRITE_CALL_LOG" /><applicationandroid:allowBackup="true"android:icon="@mipmap/ic_launcher"android:label="@string/app_name"android:roundIcon="@mipmap/ic_launcher_round"android:supportsRtl="true"android:theme="@style/AppTheme"><activityandroid:name=".MainActivity"><intent-filter><category android:name="android.intent.category.LAUNCHER"/><action android:name="android.intent.action.MAIN"/></intent-filter></activity></application></manifest>
  • 使用与该权限相关内容前,检查该权限
if (ActivityCompat.checkSelfPermission(this, Manifest.permission.WRITE_CALL_LOG)== PackageManager.PERMISSION_GRANTED) {//已经拥有该权限//...
} else {//尚未拥有该权限,去进行申请requestPermission();
}
  • 申请权限
private void requestPermission() {//上面介绍过了 ActivityCompat.shouldShowRequestPermissionRationale,所以根据需求做对应处理就好了,我这里没有做什么处理if (ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.WRITE_CALL_LOG)) {//PERMISSION_REQUEST_CODE 是代表申请该权限的申请码,随便给一个数字就可以了,不要给重复了就好,待会在下面的复写方法 onRequestPermissionsResult 中还会用到ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_CALL_LOG}, PERMISSION_REQUEST_CODE);} else {ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.WRITE_CALL_LOG}, PERMISSION_REQUEST_CODE);}
}
  • 在回调方法中处理结果
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[]  permissions, @NonNull int[] grantResults) {if (requestCode == PERMISSION_REQUEST_CODE) {if (grantResults.length == 1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {//返回结果为申请成功//...} else {//申请失败//...}}
}

5. 总结

总结起来就四步:

  • 第一步,在 AndroidManifest.xml 中声明所需要的权限
  • 第二步,调用相关方法前,检查自己有没有这个权限(ContextCompat.checkSelfPermission)
  • 第三步,如果没有,就申请这个权限(ActivityCompat.requestPermissions)
  • 第四步,申请完在回调中处理申请结果就完事了(onRequestPermissionsResult)

[Android] Android 6.0 动态权限申请看完就会写相关推荐

  1. Android 6.0动态权限申请

    Android 6.0动态权限申请 特别感谢: https://www.jianshu.com/p/2fe4fb3e8ce0 本文是在该文的基础上添加了类似自己的读后感才完成的. 我并不希望成为白求恩 ...

  2. Android 6.0 动态权限申请简单简洁优雅的处理方式

    Android M 或以上的设备,在使用涉及隐私的安全权限时,需要动态申请,虽然不难,但写下来代码工作量也不少,而且几乎每个应用都需要用到.所以一直在探索一个要足够简单简洁优雅的处理方式,强迫症的精神 ...

  3. 最容易理解的Android6.0动态权限申请教程

    1.前言 这已经是N年前的知识点了,但是我一直以来都有点逃避学习这个,而且印象中很麻烦,后来也不间断有学习过一点,但是一直没认真去用过,所以对这个android6.0的动态权限申请一直是不清楚的状态, ...

  4. Android 6.0 动态权限申请

    1. 概述 Android 6.0 (API 23) 之前应用的权限在安装时全部授予,运行时应用不再需要询问用户.在 Android 6.0 或更高版本对权限进行了分类,对某些涉及到用户隐私的权限可在 ...

  5. Android6.0动态权限申请及RxPermissions权限库使用

    一.AndroidManifest.xml 所有权限列表: 访问登记属性 android.permission.ACCESS_CHECKIN_PROPERTIES ,读取或写入登记check-in数据 ...

  6. android 6.0权限库,Android 6.0动态权限适配

    前言 最近项目发现比较多的问题是关于Android 6.0的问题,APP安装之后,在Android 6.0之后的系统,点击直接奔溃打不开,这是为什么昵?这就是Android 6.0以上的系统引入运行时 ...

  7. 【Android 应用开发】动态权限管理示例 ( 使用原生代码实现 | 申请权限 | 判定权限申请结果 | 判定 “ 不再询问 “ 情况 )

    文章目录 一.申请权限 二.判定权限申请结果 三.判定 " 不再询问 " 情况 四.完整代码示例 1.权限管理代码 2.主界面代码 3.执行结果 五.博客资源 一.申请权限 首先 ...

  8. 【Android RTMP】Android Camera 视频数据采集预览 ( 图像传感器方向设置 | Camera 使用流程 | 动态权限申请 )

    文章目录 安卓直播推流专栏博客总结 一. Camera 传感器方向简介 二. Camera 图像传感器横向显示数据 三. Camera 图像传感器纵向显示数据 四. 设置 Camera 预览数据方向 ...

  9. android 6.0动态权限问题

    最近,我发现手机的6.0权限在小米手机上存在问题,我在网上搜了很多的代码,都没有解决这个问题,所以这里记录一下自己的android 6.0权限的解决代码,如果有问题,大家可以在网上自己在找找代码去解决 ...

最新文章

  1. mysql 从第二行开始_Mysql主备一致性问题
  2. 201671010128 2017-11-05《Java程序设计》之集合
  3. Request_获取请求参数中文乱码问题处理
  4. android字符串复制到剪贴板
  5. JQuery上传插件Uploadify详解及其中文按钮解决方案
  6. 完整安卓项目开发过程和一些细节问题
  7. 强悍的 vim —— g s 替换区别
  8. 帆软邮件STMP配置、发送测试及邮件发送失败日志排查
  9. 挪威养老基金给我们的启示
  10. 思维导图软件列表(mind mapping software list)
  11. tomcat6到tomcat9解压版(64位)随意下载
  12. 计算机毕业设计之java+javaweb的房屋出租系统
  13. 深度学习/机器学习入门基础数学知识整理(八):中心极限定理,一元和多元高斯分布
  14. 蘑菇街Android组件与插件化
  15. 微信小程序富文本编辑器获取内容
  16. 7-6 谁是凶手 (100 分)
  17. Shell编程——退出状态(if语句判断某个命令的退出状态)
  18. Oracle em13c安装手册
  19. 样式案例——图片背景左上角显示用户头像和用户名
  20. 一、使用arcgis进行深度学习道路训练样本数据的制作(arcgis操作详解)——重复工作+多次返工的血泪史

热门文章

  1. win10 安装 喵喵机C1 (MAX ) 打印机如何连电脑打印 喵喵机玩法
  2. 股市小白必看!能获取股票数据的编程语言:Python带你看懂股市线
  3. Error: Unable to access jarfile xxx.jar
  4. 基于对抗互信息学习特征解耦的零样本语音转换|INTERSPEECH 2022
  5. 基于Java——SpringBoot的洗浴会所管理系统
  6. 推流端、服务端、播放端
  7. 关于 Kubernetes中API Server授权(RBAC)管理的一些笔记
  8. 生产环境容器落地最佳实践 - JFrog 内部 K8s 落地旅程
  9. C语言课程设计报告税,第十周—C语言 个人所得税的计算
  10. 做软件的也得注意休息啊