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
写入外部存储
参考: