一、权限处理分类

由上图可以看出,主要分为四类。下表逐一介绍各类对应的一些情况。

二、动态权限申请

虽然总的来说分为四类,但是只需要处理一种情况,即动态申请权限。其他三种情况,要么默认实现,要么系统定制,无法从代码角度进行调整。那么下面先来看下那些权限需要动态申请。

(1)权限列表

Android6.0以上把权限分为普通权限和危险权限,所以危险权限是需要动态申请,给予用户提示的,而危险权限就是上表展示的内容。

看到上面的 permissions,会发现一个问题,危险权限都是一组一组的。

分组对权限机制的申请是有一定影响的。例如app运行在android 6.x的机器上,对于授权机制是这样的。如果你申请某个危险的权限,假设你的app早已被用户授权了同一组的某个危险权限,那么系统会立即授权,而不需要用户去点击授权。比如你的app对READ_CONTACTS已经授权了,当你的app申请WRITE_CONTACTS时,系统会直接授权通过。

此外,对于申请时的弹窗上面的文本说明也是对整个权限组的说明,而不是单个权限。

下面介绍下Android 6.0以上 动态申请权限所设计到的一些方法。

(2)权限申请方法

在申请权限先,首先要保证在AndroidManifest中写明需要的权限。 例如:

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION"></uses-permission>复制代码

具体权限方法详解:

权限申请示例

以获取定位权限为例。

1.点击按钮,检查并申请权限

btn.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View view) {if (Build.VERSION.SDK_INT >23) {if (ContextCompat.checkSelfPermission(MainActivity.this,Manifest.permission.ACCESS_COARSE_LOCATION)== PackageManager.PERMISSION_GRANTED) {//授予权限getLoation();}else{//未获得权限requestPermissions(new String[]{Manifest.permission.ACCESS_COARSE_LOCATION},REQUEST_CODE_LOCATION);}}}});复制代码

如果有权限,执行获取位置逻辑,如果没权限,则进行请求权限。

2.权限申请结果回调

public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {if (requestCode == REQUEST_CODE_LOCATION){if (grantResults[0] == PackageManager.PERMISSION_GRANTED){getLoation();} else{if (shouldShowRequestPermissionRationale( Manifest.permission.ACCESS_COARSE_LOCATION)){new AlertDialog.Builder(this).setMessage("申请定位权限,才能为你推送更准确的信息").setPositiveButton("确定", new DialogInterface.OnClickListener() {@Overridepublic void onClick(DialogInterface dialog, int which) {//申请定位权限requestPermissions(MainActivity.this,new String[]{Manifest.permission.ACCESS_COARSE_LOCATION}, REQUEST_CODE_LOCATION);}}).show();}}return;}super.onRequestPermissionsResult(requestCode, permissions, grantResults);}复制代码

如果同意,执行获取位置逻辑,如果拒绝,重写shouldShowRequestPermissionRationale方法,返回true,向用户弹窗给出一个获取权限的提示,点击后再次申请权限。

public boolean shouldShowRequestPermissionRationale(@NonNull String permission) {if (permission.equals(Manifest.permission.ACCESS_COARSE_LOCATION) ) {return true;} else {return super.shouldShowRequestPermissionRationale(permission);}}复制代码

重写shouldShowRequestPermissionRationale,在申请位置权限时,返回true,给用户解释。

以上就是动态申请权限的逻辑,大概流程如下:

注意: shouldShowRequestPermissionRationale :默认情况下,不重写该方法,在Android原生系统中,如果第二次弹出权限申请的对话框,会出现“以后不再弹出”的提示框,如果用户勾选了,你再申请权限,则shouldShowRequestPermissionRationale返回true,意思是说要给用户一个 解释,告诉用户为什么要这个权限。

转载于:https://juejin.im/post/5cb07e78f265da0382610863

Android权限处理分类相关推荐

  1. Android开源项目分类汇总-转载

    太长了,还是转载吧... 今天在看博客的时候,无意中发现了@Trinea在GitHub上的一个项目Android开源项目分类汇总,由于类容太多了,我没有一个个完整地看完,但是里面介绍的开源项目都非常有 ...

  2. Android开源项目分类汇总[转]

    Android开源项目分类汇总 如果你也对开源实现库的实现原理感兴趣,欢迎 Star 和 Fork Android优秀开源项目实现原理解析 欢迎加入 QQ 交流群:383537512(入群理由需要填写 ...

  3. Android权限详解

    权限的介绍 权限是一种安全机制,在默认情况下任何应用都没有权限执行对其他应用.操作系统或用户有不利影响的任何操作.包括读取或写入用户的私有数据(例如联系人或电子邮件).读取或写入其他应用程序的文件.执 ...

  4. android权限集合

    Android 权限 名称 权限描述 模块 分类 备注 危险等级 拨打电话 android.permission.CALL_PHONE,允许程序从非系统拨号器里输入电话号码 恶意程序可借此在您的话费单 ...

  5. android 权限整理

    Android 权限 名称 权限描述 模块 分类 备注 危险等级 拨打电话 android.permission.CALL_PHONE,允许程序从非系统拨号器里输入电话号码 恶意程序可借此在您的话费单 ...

  6. 2016年GitHub上史上最全的Android开源项目分类汇总

    以下内容为转载 版主原网址 http://itindex.net/detail/51896-github-android-开源 GitHub上史上最全的Android开源项目分类汇总 今天在看博客的时 ...

  7. Android 开源项目分类汇总(下)

    Android 开源项目分类汇总(下) 九.ScrollView Discrollview 支持滚动时 Item 淡入淡出,平移,缩放效果的 ScrollView 项目地址:https://githu ...

  8. Android权限详解,权限整理

    权限的分类 Android中有很多权限,但并非所有的权限都是敏感权限,Android 6.0系统开始对所有权限进行了以下分类: 正常权限(Normal permissions) 正常权限是对用户隐私或 ...

  9. Android权限 权限等级 普通权限 敏感权限 申请权限

    权限等级 Android权限分为两种,normal和dangerous.normal为普通权限,不需要程序动态申请,在Manifest中声明就可以.dangerous为敏感权限,需要程序动态申请. 普 ...

最新文章

  1. 使用CSS制作圆角效果
  2. SizeBasedAndTimeBasedLog
  3. torch 判断相等
  4. python读取上一级文件夹下的图片
  5. SpringCloud Alibaba 框架下公司架构图
  6. ZooKeeper--Recipes和解决方案
  7. 通用职责分配软件原则之4-高内聚原则
  8. matlab对文本文件的读写
  9. Django学习手册 - ORM 外键
  10. 2019 世界读书日,让程序员疯狂的 13 本豆瓣高分技术书!
  11. godspeed机器人_cs1.6kz地图包下载
  12. 实验3matlab的符号运算,实验3 Matlab 符号运算及求函数极值
  13. 倾斜摄影测量三维实景建模
  14. 关于NPOI在word表格中插入行的问题
  15. java微信公众号授权登录
  16. java中常用的摘要算法
  17. 修改网络设备在路由器中显示名称
  18. 视频制作和php,【艾奇电子相册视频制作软件和PHP学校网站系统哪个好用】艾奇电子相册视频制作软件和PHP学校网站系统对比-ZOL下载...
  19. 《OpenGL ES 3.x游戏开发(下卷)》一2.4 展翅飞翔的雄鹰
  20. 如何活让自己活得充实:其实很简单,把脑子里想的东西,变成行动,就能立刻充实起

热门文章

  1. 查看 mysql 占用的内存大小_mysql查看数据库和表的占用空间大小
  2. ueditor编辑器java使用_ueditor编辑器的用法图文教程
  3. python3语法手册_Python3 学习手册每日更新
  4. 自定义变量 配置文件_「系统架构」Nginx调优之变量的使用(3)
  5. 关于AXI DMA CYCLIC 调试过程中的问题
  6. java不是有效_单选(2分) 以下哪个不是有效的Java变量名?
  7. postmessage 消息接收延迟_微信为什么会突然延迟接收消息?原来是它们搞的鬼!...
  8. 2022/4/3刷题
  9. IC/FPGA大疆笔试题分析(预分析)
  10. 【Verilog HDL 训练】第 06 天(边沿检测)