危险权限
权限组 | 权限 |
---|---|
CALENDAR(读写日历) | 1.READ_CALENDAR 2.WRITE_CALENDAR |
CAMERA(相机权限) | CAMERA |
CONTACTS(读写联系人权限) | 1.READ_CONTACTS 2.WRITE_CONTACTS 3.GET_ACCOUNTS |
LOCATION(定位权限) | 1.ACCESS_FINE_LOCATION 2.ACCESS_COARSE_LOCATION |
MICROPHONE | RECORD_AUDIO |
PHONE | 1.READ_PHONE_STATE 2.CALL_PHONE 3.READ_CALL_LOG 4.WRITE_CALL_LOG 5.ADD_VOICEMAIL 6.USE_SIP 7.PROCESS_OUTGOING_CALLS |
SENSORS | BODY_SENSORS |
SMS | 1.SEND_SMS 2.RECEIVE_SMS 3.READ_SMS 4.RECEIVE_WAP_PUSH 5.RECEIVE_MMS |
STORAGE | 1. READ_EXTERNAL_STORAGE 2.WRITE_EXTERNAL_STORAGE |
权限申请
android 6.0以后要动态生成权限 权限通过一个,同组权限默认全部通过,例如申请了read_external_storage,权限通过,则同时拥有write权限.但是8.0以后则同组权限不会认定为通过.需要手动申请,这时系统会自动批准通过.
面对此种情况,我们可以申请全部全线
申请权限流程
首次安装
- 判断权限是否开启
- 有, 执行正常主流程
没有, 请求权限(系统弹出权限对话框)
(1)同意: 执行正常主流程
(2)不同意:必要权限(app中需要,没有代码执行不了)可自定义弹框提示,点击确定去设置页面开启,如果不是必要权限不处理,执行正常主流程
(3)不同意+不在提示:必要权限可弹出弹框提示,点击确定去设置页面开启,如果不是必要权限不处理--执行正常主流程 - 再次打开app 或者再次需要此权限时
对(1)(2)处理如上,但是(3)需要特殊处理
当选择“不在提示+拒绝” 请求权限系统不会再次弹出对话框
在第一次选择“不在提示+拒绝”设置标记 noNote = true;
第二次,如果 noNote = true,自定义弹框提示,点击确定去设置页面开启
一般首页只做权限申请,不强制用户必须选择
当某个页面需要特殊权限,在强制提醒用户开启权限
不同的手机权限设置页面打开方式不同,需要适配
- 是否显示请求权限弹窗
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if(grantResults != null){
for(int i = 0;i<grantResults.length;i++){
if(PackageManager.PERMISSION_DENIED == grantResults[i]){
// 未申请时(默认) = false
// 同意 = false
// 申请拒绝+不在询问(认为用户不在需要此权限) = false
//申请拒绝 = ture
//下面就是拒绝+不在提示 = false
if(!ActivityCompat.shouldShowRequestPermissionRationale(this, permissions[i])){
Toast.makeText(this,"权限拒绝,不在询问",Toast.LENGTH_SHORT).show();
}
}
}
}
}