Android 11 打开相机
在Android 11及以上的版本,打开相机成为了开发者们常用的功能之一。本文将介绍如何在Android 11上使用相机,并提供相关代码示例。
权限请求
在使用相机之前,首先需要在AndroidManifest.xml文件中添加相机权限:
<uses-permission android:name="android.permission.CAMERA" />
在Android 11中,需要请求相机权限的同时,还需要请求相关的存储权限。因此,还需要添加以下权限:
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
同时,还需要在代码中动态请求这些权限。
private static final int REQUEST_CODE_PERMISSIONS = 100;
private static final String[] REQUIRED_PERMISSIONS = new String[]{
Manifest.permission.CAMERA,
Manifest.permission.READ_EXTERNAL_STORAGE,
Manifest.permission.WRITE_EXTERNAL_STORAGE
};
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
if (allPermissionsGranted()) {
// 权限已经被授予
openCamera();
} else {
// 向用户请求权限
ActivityCompat.requestPermissions(this, REQUIRED_PERMISSIONS, REQUEST_CODE_PERMISSIONS);
}
}
private boolean allPermissionsGranted() {
for (String permission : REQUIRED_PERMISSIONS) {
if (ContextCompat.checkSelfPermission(this, permission) != PackageManager.PERMISSION_GRANTED) {
return false;
}
}
return true;
}
@Override
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) {
if (requestCode == REQUEST_CODE_PERMISSIONS) {
if (allPermissionsGranted()) {
// 权限已经被授予
openCamera();
} else {
// 权限被拒绝
Toast.makeText(this, "权限被拒绝,无法打开相机", Toast.LENGTH_SHORT).show();
finish();
}
}
}
上述代码首先检查是否已经获取了相机和存储权限。如果权限已经被授予,则调用openCamera()
方法打开相机。如果权限尚未被授予,则使用ActivityCompat.requestPermissions()
方法请求权限。在onRequestPermissionsResult()
方法中处理权限请求结果,如果权限被拒绝,则显示一个Toast消息并结束当前Activity。
打开相机
在获取了相机权限之后,可以使用CameraX库来打开相机。CameraX是一个用于访问相机功能的Jetpack库,它提供了简化的API,可以在不同设备和版本上提供一致的相机体验。
首先,需要在build.gradle
文件中添加CameraX库的依赖:
dependencies {
def camerax_version = "1.0.0-beta11"
// 添加CameraX依赖
implementation "androidx.camera:camera-core:$camerax_version"
implementation "androidx.camera:camera-camera2:$camerax_version"
}
然后,在onCreate()
方法中打开相机:
private void openCamera() {
PreviewView previewView = findViewById(R.id.preview_view);
// 创建相机实例
ProcessCameraProvider cameraProvider = null;
try {
cameraProvider = ProcessCameraProvider.getInstance(this);
} catch (Exception e) {
e.printStackTrace();
}
if (cameraProvider != null) {
// 设置预览的生命周期所有者
previewView.setImplementationMode(PreviewView.ImplementationMode.COMPATIBLE);
CameraSelector cameraSelector = new CameraSelector.Builder()
.requireLensFacing(CameraSelector.LENS_FACING_BACK)
.build();
// 设置预览用例
Preview preview = new Preview.Builder().build();
preview.setSurfaceProvider(previewView.getSurfaceProvider());
// 绑定相机生命周期
Camera camera = cameraProvider.bindToLifecycle(this, cameraSelector, preview);
}
}
上述代码首先创建了一个PreviewView
,用于显示相机预览。然后,通过ProcessCameraProvider.getInstance(this)
方法获取相机实例。接下来,使用CameraSelector.Builder()
选择相机,默认选择后置相机。然后,创建一个预览用例,并将其与PreviewView
绑定。最后,使用cameraProvider.bindToLifecycle()
方法将相机与当前Activity的生命周期绑定起来。
总结
本文介绍了在Android 11上打开相机的基本步骤。首先,需要在AndroidManifest.xml文件中添加相机和存储权限。然后,在代码中动态请求这些权限