android权限do|android权限do you know
android6.0增加运行时权限申请
- 6.0之前应用所需权限需要在开发应用中mainifest中申请,当程序没有获取到申请的应用权限则无法安装应用程序,6.0以后可以在程序运行时,需要权限时进行申请获取。
- 并不是所有的权限都需要运行时申请,android系统定义了两种权限:普通权限、危险权限,普通权限只需要在mainifest文件中定义即可,而危险权限需要运行时申请,如果不进行申请则会抛异常导致程序crash
- 危险权限
- 一共九组24个权限
权限组 权限名 CALENDAR READ_CALENDAR
WRITE_CALENDARCAMERA CAMERA CONTACTS READ_CONTACTS
WRITE_CONTACT
GET_ACOUNTSLOCATION ACCESS_FINE_LOCATION
ACCESS_COARSE_LOCATIONMECROPHONE RECORD_RADIO SMS SEND_SMS
RECEIVE_SMS
READ_SMS
RECEIVE_MMS
RECEIVE_WAP_PUSHSTORYGE READE_EXTERNAL_STORAGE
WRITE_EXTERNAL_STORAGEPHONE READE_PHONE_STATE
CALL_PHONE
READE_CALL_LOG
WRITE_CALL_LOG
ADD_VOICEMAIL
USE_SIP
PROCESS_OUTGOING_CALLS- 一旦权限名被用户授权,则该权限组内所有的权限将都被授权
- 普通权限
- 除了危险权限外都是普通权限
- 权限申请代码(读取通讯录为例)
- 在开发中,通常对应用的运行环境进行判断,是否需要申请权限
- 申请权限
private void requestReadPhonePermission() {
final Activity activity = getActivity();
if (Build.VERSION.SDK_INT >= 23) {
if (activity != null) {
// 检查是否已有权限
if (activity.checkSelfPermission(Manifest.permission.READ_CONTACTS) != PackageManager
.PERMISSION_GRANTED) {
// 之前点击了"拒绝后不再询问”,无法再次弹出权限申请框,此判断在部分系统中会出现无法判断情况
// 去设置界面设置权限
if (ActivityCompat.shouldShowRequestPermissionRationale(activity,
(Manifest.permission.READ_CONTACTS))) {
gotoSetPage(activity); // 此种情况判定为无法弹出申请权限系统弹窗,则直接进入系统设置界面逻辑
});
} else {
// 如果没有权限并且没勾选“不再询问”,向用户发起权限请求
activity.requestPermissions(
new String[]{Manifest.permission.READ_CONTACTS}, REQUEST_PHONE_BOOK_CODE);
}
} else {
gotoPhoneBookPage(activity);
}
}
} else {
gotoPhoneBookPage(activity);
}
}
- 申请回调
- 重写activity的onRequestPermissionsResult方法
【android权限do|android权限do you know】switch (requestCode) {
case REQUEST_PHONE_BOOK_CODE: {
if (grantResults == null || grantResults.length == 0) {
return;
}
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 权限被用户同意
Activity activity = TaskManagerFactory.getTaskManager().getContainerActivity();
gotoPhoneBookPage(activity);
} else {
ToastForCarpool.show("请开启通讯录权限");
}
break;
}
default:
break;
}
推荐阅读
- android第三方框架(五)ButterKnife
- Android中的AES加密-下
- 带有Hilt的Android上的依赖注入
- android|android studio中ndk的使用
- Android事件传递源码分析
- RxJava|RxJava 在Android项目中的使用(一)
- Android7.0|Android7.0 第三方应用无法访问私有库
- 深入理解|深入理解 Android 9.0 Crash 机制(二)
- android防止连续点击的简单实现(kotlin)
- Android|Android install 多个设备时指定设备