感谢郭神,从Android 6.0开始,不再是安装应用时用户确定获得全部的权限.而是在使用软件过程中需要该权限时,弹出对话框让用户选择权限.不仅如此,用户选择权限后还可以关闭。

检查是否获得权限


通过 ContextCompat.checkSelfPermission(context,permission) 方法,方法返回值为 PackageManager.PERMISSION_GRANTED or PackageManager.PERMISSION_DENIED

请求权限


通过 ActivityCompat.requestPermissions(activity,permissions,requestCode),第二个参数是一个String数组,第三个参数是请求码便于在 onRequestPermissionsResult 方法中根据requestCode进行判断:

请求权限后的回调


请求权限后会回调 onRequestPermissionsResult 方法,在activity中重写 onRequestPermissionsResult(requestCode,permissions,grantResults) 方法, grantResults 是int类型的数组每个值为 PackageManager.PERMISSION_GRANTED or PackageManager.PERMISSION_DENIED 分别对应 permissions 的每个请求:

告诉用户为何需要权限


ActivityCompat.shouldShowRequestPermissionRationale(activity,permission)  这个方法是在用户拒绝权限后返回true。也就是说:用户第一次点击一个需要权限的地方,该方法返回false(因为用户没拒绝~),当用户拒绝掉该权限,下次点击此权限处,该方法会返回true。可在里面进行对该权限的说明,然后弹出权限让用户选择,并且对话框有don't ask again选项:

用户选择don't ask agian后


ActivityCompat.shouldShowRequestPermissionRationale(activity,permission)  方法一直返回false,并且 ActivityCompat.requestPermissions 不会弹出对话框,系统直接deny,并回调 onRequestPermissionsResult 方法:

用户拒绝权限演示


用户接受权限演示


补充


android权限有 normal 和 dangerous 两种,normal权限系统会自动赋予给应用程序,dangerous 权限则需要进行运行时权限处理。访问下面网址查看所有的dangerous权限:

https://developer.android.com/guide/topics/security/permissions.html#normal-dangerous

另外,用户还可以随时手动对运行时权限进行开关,如下图所示:

最新文章

  1. QDialog QMainwindow QWidget QFrame不同时候用法.
  2. 生成Kindle可读的mobi和PDF电子书
  3. GTD工具 Wunderlist使用心得总结
  4. required string parameter XXX is not present
  5. 最简单jquery轮播图效果
  6. Python 中的map和reduce学习笔记
  7. [Effective JavaScript 笔记]第21条:使用apply方法通过不同数量的参数调用函数
  8. ios开发 数据库版本迁移手动更新迭代和自动更新迭代
  9. maven依赖传递关系
  10. java生成指定范围的随机数
  11. hdu 2777(线段树)
  12. 201521123121 《Java程序设计》第1周学习总结
  13. Flask 之东方不败一
  14. linux后台执行./run.py提示python syntax error near unexpected token `('
  15. 【转】Python中的运算符
  16. JAVA学习资源整理
  17. 5.css背景以及书写位置
  18. .NET操作Excel笔记
  19. IOS-网络(ASI使用)
  20. 多线程中sleep和wait的区别,以及多线程的实现方式及原因,定时器--Timer

热门文章

  1. Spring系列: 使用aop报错:nested exception is java.lang.NoClassDefFoundError: org/aspectj/weaver/reflect/ReflectionWorld$Refle
  2. Logparser 的用法
  3. Xilinx命名规则
  4. 从走出校门到Java实习生生活
  5. php 接收表单 方法的区别
  6. Android图片浏览器之图片删除
  7. asp.net 预编译和动态编译
  8. javascript继承(三)—继承的实现原理
  9. ThreadLocal模式的核心元素
  10. Red Hat Linux9命令行--修改补充中