运行时权限
运行时权限是Android 6.0开始加入的功能。其作用是让用户不必在安装应用时将所有可能用到的权限全部授权给应用,而是在软件的使用过程中针对某个功能用到时再授权,即运行时授权。
而且并不是所有的权限都需要运行时授权,Android将所有权限归为了两类:普通权限和危险权限。
-
普通权限就是指不会直接威胁到用户安全和隐私的权限,对于这部分权限的申请系统会自动授权,唯一的操作就是事先在AndroidManifest文件中书写权限声明即可。
-
危险权限就是类似于获取设备联系人信息或者拨打电话等会直接威胁用户安全或者隐私的权限,对于这部分权限不仅需要进行权限声明,而且在使用时权限的处理必须要用户手动点击授权才可以,否则程序无法使用相应的权限。危险权限被分为九个权限组二十四个权限:
- 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
- ERAD_CALL_LOG
- WRITE_CALL_LOG
- ADD_VOICEMAIL
- USE_SIP
- PROCESS_OUTGOING_CALLS
- SENSORS
- BODY_SENSORS
- SMS
- SEND_SMS
- RECEIVE_SMS
- READ_SMS
- RECEIVE_WAP_PUSH
- RECEIVE_MMS
- STORAGE
- READ_EXTERNAL_STORAGE
- WRITE_EXTERNAL_STORAGE
另外危险权限授权操作是以权限组为单位进行授权处理的,当用户授权某个危险权限时系统会将该权限组的所有权限授权给程序,即程序可以使用权限组的所有权限。
其实准确来说另外还有一类特殊权限,不过使用较少。
运行时申请权限流程:
- 在AndroidMainfest中添加权限声明
- 检测是否已被授权,没有则向用户弹出申请授权提示
//通过checkSelfPermission方法判断是否被授予权限,
//如果被授予权限该方法会返回固定值PackageManager.PERMISSION_GRANTED
//反之则返回PackageManager.PERMISSION_DENIED
if (ContextCompat.checkSelfPermission(MainActivity.this, Manifest.permission.CALL_PHONE) != PackageManager.PERMISSION_GRANTED) {
//如果没有被授权则使用requestPermissions方法向用户弹出提示框申请权限,其结果将会回调到onRequestPermissionsResult方法中
ActivityCompat.requestPermissions(MainActivity.this, new String[]{Manifest.permission.CALL_PHONE}, 10086);
} else {
call();
}
- 处理授权操作结果
//重写onRequestPermissionsResult方法用于处理申请权限操作的返回结果
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
switch (requestCode) {
case 10086:
//如果授权操作意外中断将会返回空的授权数组和空的权限,此处检测权限数组不应为空,
//而且如果数组不为空但没有授权会返回PackageManager.PERMISSION_DENIED
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
call();
} else {
//执行被拒绝授权的操作
Toast.makeText(MainActivity.this, "You denied the permission!", Toast.LENGTH_SHORT).show();
}
break;
default:
}
}