一、为什么需要用户手动赋予权限
以下摘录自Google官方文档:https://developer.android.com/training/permissions/requesting#normal-dangerous
系统权限分为两类:正常权限和危险权限
正常权限不会直接给用户隐私权带来风险。如果您的应用在其清单中列出了正常权限,系统将自动授予该权限。
危险权限会授予应用访问用户机密数据的权限。如果您的应用在其清单中列出了正常权限,系统将自动授予该权限。如果您列出了危险权限,则用户必须明确批准您的应用使用这些权限。
二、什么权限会被定义为危险权限
权限组来自Google官方文档:https://developer.android.com/guide/topics/security/permissions#normal-dangerous
权限组 | 权限 |
---|---|
CALENDAR |
|
CAMERA |
|
CONTACTS |
|
LOCATION |
|
MICROPHONE |
|
PHONE |
|
SENSORS |
|
SMS |
|
STORAGE |
|
三、动态权限的获取(第三方库方法)
第一步:在AndroidManifest.xml中申明你所需要用到的危险权限
第二步:在build.gradle中添加依赖的第三方库
(注意:在AndroidStudio3.0及以上版本中compile已被弃用,其方法更改为api 或 implementation)
implementation 'com.tbruyelle.rxpermissions:rxpermissions:0.7.0@aar'
implementation 'io.reactivex:rxjava:1.1.6'
第三步:在代码中获取权限
if (Build.VERSION.SDK_INT>=Build.VERSION_CODES.M){//检测当前版本是否为6.0及其以上
RxPermissions.getInstance(this)
.request(
//申请的危险权限添加在此,可申请多个危险权限
Manifest.permission.READ_PHONE_STATE,
Manifest.permission.READ_EXTERNAL_STORAGE)
.subscribe(new Action1<Boolean>() {
@TargetApi(23) //如果build.gradle申明的最小版本低于23,则需要添加此句兼容低版本
@Override
public void call(Boolean granted) {
if (granted) {
//权限被全部同意
Log.d("权限", "权限被同意 ");
} else if(shouldShowRequestPermissionRationale(Manifest.permission.READ_PHONE_STATE)
| shouldShowRequestPermissionRationale(Manifest.permission.READ_EXTERNAL_STORAGE)){
//用户拒绝了权限
Log.d("权限", "权限被拒绝 ");
}else{
Log.d("权限", "权限被拒绝,并且勾上不再询问 ");
//用户拒绝了权限,并且勾上了不再询问
}
}
});
}else{
//版本低于Android6.0,危险权限不需要用户同意
Log.d("权限", "版本低于6.0,直接进入主程序");
}
以上就是Android 6.0以上获取动态权限的方法