返回
Android 11 相机适配不迷路,资深开发的亲身经验分享
Android
2024-02-05 14:44:02
背景
Android 11 带来了一系列新的特性和功能,其中之一就是对相机权限的更改。在 Android 11 之前,相机权限是一项全局权限,只要用户授予该权限,应用程序就可以访问设备上的所有摄像头。然而,在 Android 11 中,相机权限被细分为两项权限:摄像头权限和麦克风权限。这意味着应用程序现在需要分别申请这两项权限,才能访问设备上的摄像头和麦克风。
适配
为了适配 Android 11 的相机权限更改,我们需要对应用程序进行一些修改。首先,我们需要在应用程序的清单文件中声明所需的权限。在 <manifest>
标签中添加以下代码:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
接下来,我们需要在应用程序中申请相机和麦克风权限。我们可以使用 ActivityCompat
类的 requestPermissions()
方法来申请权限。在 onRequestPermissionsResult()
方法中,我们可以处理用户的权限请求结果。以下代码演示了如何申请相机和麦克风权限:
private void requestCameraPermission() {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.CAMERA}, REQUEST_CODE_CAMERA);
}
private void requestMicrophonePermission() {
ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.RECORD_AUDIO}, REQUEST_CODE_MICROPHONE);
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults);
if (requestCode == REQUEST_CODE_CAMERA) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 相机权限已授予
} else {
// 相机权限未授予
}
} else if (requestCode == REQUEST_CODE_MICROPHONE) {
if (grantResults.length > 0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 麦克风权限已授予
} else {
// 麦克风权限未授予
}
}
}
除了申请权限之外,我们还需要修改应用程序的代码以使用新的相机 API。在 Android 11 中,相机 API 进行了重大修改。旧的 Camera
类已被弃用,取而代之的是新的 CameraX
库。CameraX
库提供了更现代、更易于使用的 API,可以帮助我们更轻松地构建相机应用程序。
以下代码演示了如何使用 CameraX
库拍摄照片:
private void takePicture() {
final CameraX.Builder builder = new CameraX.Builder(this, cameraProvider);
final CameraSelector cameraSelector = new CameraSelector.Builder()
.requireLensFacing(CameraSelector.LENS_FACING_BACK)
.build();
builder.setCameraSelector(cameraSelector);
final Camera camera = builder.build();
camera.bindToLifecycle(this);
final ImageCapture.Builder imageCaptureBuilder = new ImageCapture.Builder();
final ImageCapture imageCapture = imageCaptureBuilder.build();
imageCapture.takePicture(ContextCompat.getMainExecutor(this), new ImageCapture.OnImageCapturedListener() {
@Override
public void onImageCaptured(@NonNull ImageProxy image) {
// 照片已拍摄
}
});
}
总结
Android 11 相机适配是一项相对复杂的任务,但只要我们按照正确的步骤操作,就可以轻松完成。在本文中,我分享了自己在 Android 11 相机适配过程中的经验,希望能帮助大家更轻松地完成这项任务。