安卓系统的权限管理机制从API 23 (也就是Android 6.0 又叫做 Android M,)之后发生了比较大的改变,在一些比较危险的权限上要求必须申请动态权限,即使你在AndroidMainfest.xml文件中申请也没有任何用,或者你可以将编译的目标版本设定这API 22,这样就可以了。但这并不是长久之计,不是吗?所以因此在这里学习一下。
动态权限需求原因
Android 6.0之前,权限在应用安装过程中只询问一次,以列表的形式展现给用户,然而大多数用户并不会注意到这些,直接就下一步了,应用安装成功后就会被赋予清单文件中的所有权限,应用就可以在用户不知情的情况下进行非法操作(比如偷偷的上传用户数据)。
需要动态申请的权限如下:
READ_CALENDAR , WRITE_CALENDAR 读写日历权限
CAMERA 调用相机权限
READ_CONTACTS , WRITE_CONTACTS , GET_ACCOUNTS 通讯录权限
ACCESS_FINE_LOCATION, ACCESS_COARSE_LOCATION 定位权限
RECORD_AUDIO 录音权限
READ_PHONE_STATE ,CALL_PHONE READ_CALL_LOG, WRITE_CALL_LOG ADD_VOICEMAIL//手机状态相关
BODY_SENSORS 传感器权限
SMS SEND_SMS ,RECEIVE_SMS ,READ_SMS, RECEIVE_WAP_PUSH, RECEIVE_MMS SMS消息权限
READ_EXTERNAL_STORAGE ,WRITE_EXTERNAL_STORAGE 外部存储权限
动态权限申请步骤
AndroidMainfest.xml文件配置
没有具体分析是什么原因,可能是为了兼容低版本吧,有兴趣的自行Google一下
判断Android系统版本
在官方的文档中,可以看到低于API23 是不需要使用动态权限申请的,我们需要判断一下,代码如下: 如果是Android 6.0以上的系统,需要进行判断,我们大致看一下
if (Build.VERSION.SDK_INT>=23) {
//此处做动态权限申请
}
else {
//低于23 不需要特殊处理
}
}
检查权限
如果版本高于23 ,则需要进行特殊处理,我们这里检查一下有没有权限
使用ContextCompat.CheckSlefPermission &