1. Android 6.0 运行时权限的介绍
在保护用户隐私方面:Android6.0为了更好的保护个人隐私,添加了运行时权限:分为两类,一类是Normal Permissions,这类权限不涉及个人隐私,不需要用户进行授权,比如手机震动,访问网络;一类是Dangerous Permissions,这类权限涉及个人隐私,需要用户进行授权,比如读取SD卡,访问通讯录等。
在用户操作方面:当执行敏感操作之前弹出对话框,请求权限,可以拒绝,可以同意;可以在设置页面对APP的权限进行查看,以及对单个权限进行授权或者解除授权。
2. 为什么需要配置运行时权限及解决办法
为什么:
- 直接原因:
当我们把targetSdkVersion设置为大于22的版本后,如果我们申请危险权限的时候,谷歌就会强制我们使用动态申请,否则会报错。
- 根本原因:保护个人隐私,提高安全性
在6.0之前,权限会在显示在安装页面,告知APP访问哪些权限,如果你同意它访问这些权限,就可以安装,如果不同意就不能安装这款APP.因此好多App存在着滥用权限的情况,不管你用不用得到,先把权限申请了再说。举例说明:微信要读取手机里面的短信和彩信,这是不认可的,但是如果你不同意这项权限,你是无法安装这款App的;
在6.0之后,用户不需要在安装软件的时候一次性授权所有申请的权限,而是可以在软件的使用过程中再对某一项权限申请进行授权。举例说明:一款相机应用在运行时申请了地理位置定位权限,就算我拒绝了这个权限,我仍然可以使用这款应用的其他功能,不用像6.0之前无法安装它。
解决办法:
- 投机取巧
如果我们不想使用6.0或者7.0的新特性,那么我们把targetSdkVersion设置22,就可以很好的避开动态配置运行时权限。而targetSdkVersion设置为22,并不影响其在Android 6.0或7.机制上使用,因为高版本兼容低版本。
- 光明大道
配置运行时权限。
3. 正常权限和危险权限罗列:
Normal Permissions:
WRITE_SYNC_SETTINGS 写同步设置
WAKE_LOCK 唤醒锁
VIBRATE 颤动
USE
FINGERPRINT 使用指纹
UNINSTALL_SHORTCUT 卸载快捷方式
TRANSMIT_IR 红外传输
SET_WALLPAPER_HINTS 壁纸设置提示
SET_WALLPAPER 设置壁纸
SET_TIME_ZONE 设置时区
SET_ALARM 设置闹钟
REQUEST_INSTALL_PACKAGES 请求安装包
REORDER_TASKS 重新排序的任务
RECEIVE_BOOT_COMPLETED 收到启动完成
READ_SYNC_STATS 读同步数据
NFCMODIFY_AUDIO_SETTINGS 修改音频设置
KILL_BACKGROUND_PROCESSES 杀死后台进程
INTERNET 网络
INSTALL_SHORTCUT 安装快捷方式
GET
PACKAGE
SIZE 得到包的大小
EXPAND_STATUS_BAR 扩大状态栏
DISABLE_KEYGUARD 禁用键盘守卫
CHANGE_WIFI_STATE 更改无限网络状态
CHANGE_WIFI_MULTICAST_STATE 改变无限多播状态
CHANGE_NETWORK_STATE 改变网络状态
BROADCAST_STICKY 粘性广播
BLUETOOTH_ADMIN 蓝牙管理
BLUETOOTH 蓝牙技术
ACCESS_WIFI_STATE 访问无限网络状态
ACCESS_NOTIFICATION_POLICY 访问通知策略
ACCESS_NETWORK_STATE 访问网络状态
ACCESS_LOCATION_EXTRA_COMMANDS 访问地点额外的命令
Dangerous Permissions(9组24个):
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 使用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 收到WAP推送
permission:android
.permission.RECEIVE
_MMS 接收彩信
permission:android
.permission.RECEIVE
_SMS 收信息
permission:android
.permission.SEND
_SMS 发信息
permission:android
.permission.READ
_CELL_BROADCASTS 读细胞广播
注意:你不需要了解每个权限的作用,只要把它当成一个参照表来查看就行了。在申请权限的时候,来查下,如果在危险权限里面,那就配置运行时权限,如果不在就在注册文件里面添加一下权限声明就可以了。
4. Android 6.0的运行时权限的授权机制:
Android
权限都是分组的,所以授权机制会因此受到影响,授权机制如下:
- 当申请某个危险权限的时候,如果用户在手机后台已经对分组内的其他危险权限进行了授权,那么系统会立即授权该权限(需要申请的),不会让用户进行点击授权,比如app后台已经授权READ_EXTERNAL_STORAGE (读取外部存储器),当你申请WRITE_EXTERNAL_STORAGE (写外部存储器)的时候,系统会立即授权,不会再让点击授权。
- 需要点击申请危险权限的时候,弹出对话框,这个对话框是不可以定制的;对话框的文本说明,是对整个组的权限说明,而非某一项的。
- 不要对权限组过多的依赖,尽量对每一个我先权限都进行申请。