启动相机的方法
1. Camera1 API
Camera1 API
是安卓早期的相机接口,尽管它在新版本的 Android 中已被弃用,但它仍然被一些旧设备和应用所使用。
打开相机的步骤:
获取
Camera
实例:- 作用:通过
Camera.open()
打开相机硬件。 - 代码:
Camera camera = Camera.open();
- 作用:通过
设置相机预览:
- 作用:将相机输出的图像数据显示到
SurfaceView
或TextureView
上。 - 代码:
camera.setPreviewDisplay(surfaceHolder);
- 作用:将相机输出的图像数据显示到
启动预览:
- 作用:开始相机的实时预览。
- 代码:
camera.startPreview();
释放相机资源:
- 作用:停止预览并释放相机资源。
- 代码:
camera.stopPreview();
和camera.release();
简洁总结:
- 获取相机实例:
Camera.open()
打开相机。 - 设置预览显示:
setPreviewDisplay()
将预览显示到SurfaceView
。 - 开始预览:
startPreview()
启动相机预览。 - 释放相机资源:
stopPreview()
和release()
释放资源。
2. CameraX API
CameraX API
是 Google 提供的一个相机库,它是基于 Camera2 API
构建的,旨在简化相机开发,提供一致性和更好的兼容性,特别是在不同设备和 Android 版本上。
打开相机的步骤:
添加依赖项:
- 作用:首先,需要在项目中添加
CameraX
的依赖项。 - 代码(
build.gradle
):gradledependencies { implementation "androidx.camera:camera-core:1.0.0" implementation "androidx.camera:camera-camera2:1.0.0" implementation "androidx.camera:camera-lifecycle:1.0.0" }
- 作用:首先,需要在项目中添加
初始化
CameraX
配置:- 作用:配置
CameraX
并选择相机的用例(如预览、图片捕获等)。 - 代码:kotlin
val cameraProviderFuture = ProcessCameraProvider.getInstance(context) cameraProviderFuture.addListener({ val cameraProvider = cameraProviderFuture.get() val preview = Preview.Builder().build() val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA }, ContextCompat.getMainExecutor(context))
- 作用:配置
绑定生命周期:
- 作用:将相机与生命周期绑定,确保相机资源在生命周期结束时自动释放。
- 代码:kotlin
cameraProvider.bindToLifecycle(lifecycleOwner, cameraSelector, preview)
显示相机预览:
- 作用:通过
Preview
用例将相机预览显示到PreviewView
。 - 代码:kotlin
preview.setSurfaceProvider(previewView.createSurfaceProvider())
- 作用:通过
释放相机资源:
- 作用:
CameraX
会自动管理相机资源,通常无需手动释放,但可以在onPause()
等生命周期方法中进行一些清理工作。
- 作用:
3. Camera2 API
1. 初始化 CameraManager
- 作用:获取系统的相机管理器,用于管理和访问设备的相机。
- 代码:
mCameraManager = getSystemService(CAMERA_SERVICE) as CameraManager
2. 选择相机 ID
- 作用:通过
CameraManager
获取所有可用的相机 ID,选择一个相机(例如后置摄像头)。 - 代码:
val cameraId = mCameraManager.cameraIdList[0]
3. 打开相机
- 作用:使用
CameraManager.openCamera()
方法打开选择的相机,并创建一个CameraDevice
实例,开始相机的操作。 - 代码:
mCameraManager.openCamera(cameraId, stateCallback, handler)
4. 创建预览会话
- 作用:在相机打开后,使用
CameraDevice.createCaptureSession()
创建一个预览会话,将SurfaceView
显示内容与相机预览绑定。 - 代码:
camera.createCaptureSession(listOf(surface), stateCallback, handler)
5. 启动预览
- 作用:配置相机的预览请求并开始显示相机内容。
- 代码:
mCaptureSession.setRepeatingRequest(previewRequest, null, mBackgroundHandler)
6. 释放相机
- 作用:在不需要相机时,释放相机资源,关闭会话,释放硬件资源。
- 代码:
mCameraDevice.close()
简洁总结:
- 初始化管理器:获取
CameraManager
。 - 选择相机:选择需要的相机(前置/后置)。
- 打开相机:打开相机并获取
CameraDevice
。 - 创建会话:创建相机预览会话并绑定到
SurfaceView
。 - 启动预览:开始相机预览。
- 释放资源:停止预览并释放相机资源。