6.0运行时权限
来源:互联网 发布:linux虚拟机安装教程 编辑:程序博客网 时间:2024/06/10 17:30
涉及到的代码在这里
流程图
先看下权限申请流程图吧
效果图
介绍
从 Android 6.0(API 级别 23)开始,用户开始在应用运行时向其授予权限,而不是在应用安装时授予。此方法可以简化应用安装过程,因为用户在安装或更新应用时不需要授予权限。它还让用户可以对应用的功能进行更多控制;用户可以随时进入应用的“Settings”屏幕调用权限。
权限
权限分类
系统权限分为两类:正常权限和危险权限,无论是哪一种都必须在清单文件中列出来。
正常权限不会直接给用户隐私权带来风险。如果您的应用在其清单中列出了正常权限,系统将自动授予该权限。
危险权限会授予应用访问用户机密数据的权限。如果您的应用在其清单中列出了正常权限,系统将自动授予该权限。如果您列出了危险权限,则用户必须明确批准您的应用使用这些权限。
权限组
任何权限都有一个所属的权限组,包括正常权限和应用定义的权限。仅当使用危险权限时才影响用户体验,在不同版本上的表现在下面会有详细说明。可以忽略正常权限的权限组。
权限列表
正常权限
ACCESS_LOCATION_EXTRA_COMMANDS
ACCESS_NETWORK_STATE
ACCESS_NOTIFICATION_POLICY
ACCESS_WIFI_STATE
BLUETOOTH
BLUETOOTH_ADMIN
BROADCAST_STICKY
CHANGE_NETWORK_STATE
CHANGE_WIFI_MULTICAST_STATE
CHANGE_WIFI_STATE
DISABLE_KEYGUARD
EXPAND_STATUS_BAR
GET_PACKAGE_SIZE
INSTALL_SHORTCUT
INTERNET
KILL_BACKGROUND_PROCESSES
MODIFY_AUDIO_SETTINGS
NFC
READ_SYNC_SETTINGS
READ_SYNC_STATS
RECEIVE_BOOT_COMPLETED
REORDER_TASKS
REQUEST_IGNORE_BATTERY_OPTIMIZATIONS
REQUEST_INSTALL_PACKAGES
SET_ALARM
SET_TIME_ZONE
SET_WALLPAPER
SET_WALLPAPER_HINTS
TRANSMIT_IR
UNINSTALL_SHORTCUT
USE_FINGERPRINT
VIBRATE
WAKE_LOCK
WRITE_SYNC_SETTINGS危险权限与权限组
可以通过如下命令来查看
adb shell pm list permissions -d -g
Dangerous Permissions://group:android.permission-group.CONTACTS permission:android.permission.WRITE_CONTACTS permission:android.permission.GET_ACCOUNTS permission:android.permission.READ_CONTACTS//group:android.permission-group.PHONE permission:android.permission.READ_CALL_LOG permission:android.permission.READ_PHONE_STATE permission:android.permission.CALL_PHONE permission:android.permission.WRITE_CALL_LOG permission:android.permission.USE_SIP permission:android.permission.PROCESS_OUTGOING_CALLS permission:com.android.voicemail.permission.ADD_VOICEMAIL//group:android.permission-group.CALENDAR permission:android.permission.READ_CALENDAR permission:android.permission.WRITE_CALENDAR//group:android.permission-group.CAMERA permission:android.permission.CAMERA//group:android.permission-group.SENSORS permission:android.permission.BODY_SENSORS//group:android.permission-group.LOCATION permission:android.permission.ACCESS_FINE_LOCATION permission:android.permission.ACCESS_COARSE_LOCATION//group:android.permission-group.STORAGE permission:android.permission.READ_EXTERNAL_STORAGE permission:android.permission.WRITE_EXTERNAL_STORAGE//group:android.permission-group.MICROPHONE permission:android.permission.RECORD_AUDIO//group:android.permission-group.SMS permission:android.permission.READ_SMS permission:android.permission.RECEIVE_WAP_PUSH permission:android.permission.RECEIVE_MMS permission:android.permission.RECEIVE_SMS permission:android.permission.SEND_SMS permission:android.permission.READ_CELL_BROADCASTS
危险权限在不同版本上的表现
系统只告诉用户应用需要的权限组,而不告知具体权限。
Android 5.1 或更低版本,或者应用的目标 SDK 为 22 或更低:
如果您在清单中列出了危险权限,则用户必须在安装应用时授予此权限,否则系统根本不会安装应用。Android 6.0 或更高版本,或者应用的目标 SDK 为 23或更高:
- 应用必须在清单中列出权限,并且它必须在运行时请求其需要的危险权限,如果没有申请权限而直接使用相应功能则会出现下面的异常堆栈。用户可以授予或拒绝每项权限,如果用户拒绝权限请求,则不能使用相应功能。
- 请求危险权限时,如果应用目前在所属权限组中没有任何权限,则系统会向用户显示一个对话框,描述应用要访问的权限组。对话框不描述该组内的具体权限。例如,如果应用请求 READ_CONTACTS 权限,系统对话框只说明该应用需要访问设备的联系信息。如果用户批准,系统将向应用授予其请求的权限。
- 如果应用在所属权限组中已有另一项危险权限,则系统会立即授予该权限,而无需与用户进行任何交互。例如,如果某应用已经请求并且被授予了 READ_CONTACTS 权限,然后它又请求 WRITE_CONTACTS,系统将立即授予该权限。
异常堆栈
E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.org.bigmaning.runtimepermission, PID: 4361
java.lang.RuntimeException: Unable to start activity
…
with revoked permission android.permission.CAMERA
…
Caused by: java.lang.SecurityException: Permission Denial: starting Intent { act=android.media.action.IMAGE_CAPTURE cmp=com.android.camera/.Camera }
…
with revoked permission android.permission.CAMERA
申请权限
相关方法
- 检查相应权限是否被授权
checkSelfPermission(String permissionName)- PackageManager.PERMISSION_GRANTED 授权
- PackageManager.PERMISSION_DENIED 拒绝
- 是否要展示请求权限的理由
shouldShowRequestPermissionRationale(String permissionName)- false
- 此前应用没有请求过此权限,第一请求权限时
- 此前用户拒绝了此权限并选中了不再询问
- true
- 此前用户拒绝了此权限但没有勾选不再询问
- false
- 请求权限
requestPermissions(String[] permissions, int requestCode) - 请求结果回调
onRequestPermissionsResult(int requestCode, String[] permissions,int[] grantResults)
效果
结合上面的例子,主要演示拒绝授权的情况。
- 应用首次申请照相机权限
.
模拟用户点击拒绝
2. 第二次申请权限
.
还是模拟用户点击拒绝(不勾选 不再提示)
3. 第三次申请权限
.
还是模拟用户点击拒绝(勾选 不再提示)
4. 第四次申请权限
.
因为第三次的表现,此时系统会直接拒绝这个权限,并回调onRequestPermissionsResult()。
总结
- 运行时权限的申请流程还是很简单的,这里简单说下shouldShowRequestPermissionRationale(…) ,这个方法仅当为true时,可以向用户解释为什么需要这个权限,增加授权的机会。根据同学们的业务要求,决定用不用这个功能。
- 在onRequestPermissionsResult回调中,如果用户拒绝了权限,应该提示用户到设置里手动开启相应权限。
Github上star最多的实用工具
- PermissionsDispatcher
- RxPermissions
- easypermissions
- Dexter
- AndPermission
- 6.0运行时权限
- 6.0运行时权限
- 6.0运行时权限
- Android 6.0运行时权限
- Android 6.0运行时权限
- Android 6.0运行时权限
- Android 6.0+ 运行时权限
- Android 6.0运行时权限
- Android 6.0运行时权限
- android 6.0运行时权限
- android 6.0运行时权限
- Android 6.0 运行时权限
- Android 6.0运行时权限
- Android 6.0运行时权限
- Android 6.0 运行时权限
- Android 6.0运行时权限
- Android 6.0运行时权限
- Android 6.0 运行时权限
- JAVA中查询一个词在内容中出现的次数、判断集合中是否包含关键字、查询字符串数组单个字符的长度
- java.lang.UnsupportedClassVersionError jar版本不一致错误
- Selenium Webdriver重新使用已打开的浏览器实例
- C++引用
- 深度学习与计算机视觉(12)_tensorflow实现基于深度学习的图像补全
- 6.0运行时权限
- Android中的事件分发之自我见
- 【SOA】1.SOA
- hexo操作指南-常用命令
- CentOS mini下安装jdk简易方法
- NOIP 2005 普及组 复赛 medic 采药
- linux GUI-directfb+gtk
- AndroidStudio中使用老版本Gradle出现的问题
- linux scala安装与配置详解