Android6.0中为提高用户安全性,加入了RuntimePermission。对部分高危权限进行进一步的限制。
RuntimePermission特点:
targetSDK版本低于Android23,程序安装时会默认授权所有在清单文件中注册的权限,不需要运行时权限。
App是从低版本兼容,升级而来,程序拥有低版本时授权的所有权限。
申请授权运行时权限:
检查权限是否被授权:
ContextCompat.checkSelfPermission(context,permission)
Permission: Manifest.permission.
Return:
PackageManager.PERMISSION_DENIED 权限未被授权
PackageManager.PERMISSION_GRANTED 权限已被授权
请求授权:
ActivityCompat.requestPermissions(activity,permissions,requestCode);
权限授权回调:
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
}
RuntimePermission封装:
运行时权限与Activity是高度耦合的,方法的使用需要Activity作为参数,回调需要重写Activity中的方法。对RuntimePermission进行封装,有几种方式:
使用一个透明的Activity,将RuntimePermission相关操作封装,在需要使用时直接调用,调用结束finish掉该Activity。
使用Fragment,将Fragment添加到当前Activity中,Fragment本身无大小。RxPermissions。
在BaseActivity中封装RuntimePermission相关方法。用回调实现是否授权成功后的操作。在非Activity中调用,可以创建ActivityCollector类获取TopActivity传入方法。
Android6.0危险权限:
权限组 | 权限名称 | 权限效果 |
---|---|---|
CALENDAR | READ_CALENDAR | 读取日历 |
WRITE_CALENDAR | 写入日历 | |
CAMERA | CAMERA | 相机拍照 |
CONTACTS | READ_CONTACTS | 读取联系人 |
WRITE_CONTACTS | 写入联系人 | |
GET_ACCOUNTS | 获取手机号码 | |
LOCATION | ACCESS_FINE_LOCATION | 获取精确位置 |
ACCESS_COARSE_LOCATION | 获取大概位置 | |
MICROPHONE | RECORD_AUDIO | 录音 |
PHONE | READ_PHONE_STATE | 读取通话状态 |
CALL_PHONE | 拨出电话 | |
READ_CALL_LOG | 读取通话记录 | |
WRITE_CALL_LOG | 写入通话记录 | |
ADD_VOICEMAIL | 新增语音留言 | |
USE_SIP | 使用SIP网络电话 | |
PROCESS_OUTGOING_CALLS | 存取拨出电话 | |
SENSORS | BODY_SENSORS | 读取体感资料 |
SMS | SEND_SMS | 发送短信 |
RECEIVE_SMS | 接收短信 | |
READ_SMS | 读取短信 | |
RECEIVE_WAP_PUSH | 接收WAP推送信息 | |
RECEIVE_MMS | 接收多媒体短信 | |
STORAGE | READ_EXTERNAL_STORAGE | 读取外部存储 |
WRITE_EXTERNAL_STORAGE | 写入外部存储 |
参考: