Android6.0运行时权限适配

17 阅读3分钟

运行时权限适配

在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: 向外部存储写入内容。

更多资源