运行时权限适配
在Android 6.0之前,权限是在应用安装时授予的。然而,从Android 6.0开始,某些危险权限需要在应用运行时请求。
适配方案
1. 检查权限
在执行需要权限的操作之前,首先要检查是否已经授予了该权限。
if (ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
// 权限尚未授予
}
2. 请求权限
如果权限尚未授予,需要向用户请求权限。
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CAMERA_PERMISSION);
3. 处理权限请求结果
用户响应权限请求后,需要在 onRequestPermissionsResult
方法中处理结果。
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
if (requestCode == REQUEST_CAMERA_PERMISSION) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 权限被授予
} else {
// 权限被拒绝
}
}
}
4. 处理用户拒绝权限并选中了“不再询问”选项的情况
@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CAMERA_PERMISSION) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 权限被授予
// 执行需要权限的操作
} else {
// 权限被拒绝
if (!ActivityCompat.shouldShowRequestPermissionRationale(this, Manifest.permission.CAMERA)) {
// 用户选中了“不要再问”选项
showSettingsDialog();
}
}
}
}
private void showSettingsDialog() {
new AlertDialog.Builder(this)
.setTitle("需要相机权限")
.setMessage("这个应用需要相机权限来拍摄照片。请在设置中授予相机权限。")
.setPositiveButton("去设置", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 打开应用设置
Intent intent = new Intent(Settings.ACTION_APPLICATION_DETAILS_SETTINGS,
Uri.fromParts("package", getPackageName(), null));
intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK);
startActivity(intent);
}
})
.setNegativeButton("取消", new DialogInterface.OnClickListener() {
@Override
public void onClick(DialogInterface dialog, int which) {
// 用户拒绝
}
})
.show();
}
危险权限组和权限
在Android 6.0中,权限被分类为“正常权限”和“危险权限”。正常权限会在安装时自动授予,而危险权限则需要在运行时请求用户授权。危险权限被进一步划分为不同的权限组,每个权限组包含相关的具体权限。
1. CALENDAR 权限组
READ_CALENDAR
: 读取日历事件和机密信息。WRITE_CALENDAR
: 添加或修改日历事件,发送电子邮件给嘉宾。
2. CAMERA 权限组
CAMERA
: 拍摄照片和视频。
3. CONTACTS 权限组
READ_CONTACTS
: 读取联系人信息。WRITE_CONTACTS
: 修改联系人信息。GET_ACCOUNTS
: 访问设备上的账户列表。
4. LOCATION 权限组
ACCESS_FINE_LOCATION
: 通过GPS获取精确位置。ACCESS_COARSE_LOCATION
: 通过WiFi或移动基站获取粗略位置。
5. MICROPHONE 权限组
RECORD_AUDIO
: 录制音频。
6. PHONE 权限组
READ_PHONE_STATE
: 读取电话状态和设备标识。CALL_PHONE
: 拨打电话。READ_CALL_LOG
: 读取通话记录。WRITE_CALL_LOG
: 修改通话记录。ADD_VOICEMAIL
: 添加语音邮件。USE_SIP
: 使用SIP服务。PROCESS_OUTGOING_CALLS
: 监视、修改或终止拨出电话。
7. SENSORS 权限组
BODY_SENSORS
: 访问传感器数据,如心率监测器。
8. SMS 权限组
SEND_SMS
: 发送短信。RECEIVE_SMS
: 接收短信。READ_SMS
: 读取短信。RECEIVE_WAP_PUSH
: 接收WAP推送消息。RECEIVE_MMS
: 接收彩信。
9. STORAGE 权限组
READ_EXTERNAL_STORAGE
: 读取外部存储中的内容。WRITE_EXTERNAL_STORAGE
: 向外部存储写入内容。