将相机体验提升到新高度:使用 Android CameraX 实现图像和视频采集
2023-09-06 16:54:31
CameraX 是 Google 开发的一款 Android Jetpack 库,旨在简化摄像头功能的开发过程。它提供了一组一致的 API 接口,适用于所有运行 Android 5.0 (API 等级 21) 及更高版本的设备。借助 CameraX,开发者能够轻松地将强大的相机功能集成到他们的应用程序中,例如图像和视频的捕捉,而无需深入了解底层相机硬件的复杂性。
CameraX 的优势在于它提供了跨设备的一致体验。开发者不必再为适配不同设备的相机 API 而烦恼,CameraX 已经为他们做好了这一切。这极大地简化了应用程序的开发和维护过程。
要开始使用 CameraX,开发者需要在他们的 Gradle 文件中添加以下依赖项:
implementation "androidx.camera:camera-core:1.0.0-beta02"
implementation "androidx.camera:camera-camera2:1.0.0-beta02"
implementation "androidx.camera:camera-lifecycle:1.0.0-beta02"
implementation "androidx.camera:camera-view:1.0.0-beta02"
添加依赖项后,开发者就可以在他们的应用程序中使用 CameraX 了。以下是一个简单的示例,展示如何使用 CameraX 捕捉图像:
class MainActivity : AppCompatActivity() {
private lateinit var cameraExecutor: ExecutorService
private lateinit var cameraProvider: CameraProvider
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// Create an ExecutorService for CameraX to use
cameraExecutor = Executors.newSingleThreadExecutor()
// Get an instance of the CameraProvider
cameraProvider = CameraProvider.getInstance()
// Create a preview use case
val previewUseCase = Preview.Builder()
.build()
// Create an image capture use case
val imageCaptureUseCase = ImageCapture.Builder()
.build()
// Create a new camera selector
val cameraSelector = CameraSelector.Builder()
.requireLensFacing(CameraSelector.LENS_FACING_BACK)
.build()
// Bind the use cases to the camera
cameraProvider.bindToLifecycle(this, cameraSelector, previewUseCase, imageCaptureUseCase)
// Get a reference to the viewfinder
val viewFinder = findViewById<TextureView>(R.id.viewFinder)
// Attach the viewfinder to the preview use case
previewUseCase.attachToView(viewFinder)
// Set up a listener for image capture events
imageCaptureUseCase.addImageCaptureListener(cameraExecutor, object : ImageCapture.OnImageCapturedListener() {
override fun onCaptureSuccess(image: ImageProxy) {
// Do something with the image
image.close()
}
override fun onError(error: ImageCaptureException) {
// Handle the error
}
})
}
override fun onDestroy() {
super.onDestroy()
cameraExecutor.shutdown()
}
}
在这个示例中,我们首先创建了一个 ExecutorService,CameraX 将使用它来执行任务。然后,我们获取一个 CameraProvider 实例,该实例将用于获取设备上的摄像头。
接下来,我们创建两个用例:一个用于预览摄像头馈送的预览用例和一个用于捕捉图像的图像捕捉用例。我们还创建了一个相机选择器,该选择器指定我们希望使用的摄像头(在这种情况下,我们选择后置摄像头)。
最后,我们将用例绑定到相机,并将视图查找器附加到预览用例。现在,当用户点击捕捉图像按钮时,应用程序将捕捉图像并将图像数据传递给 OnImageCapturedListener,该监听器可以保存图像或执行其他处理。
CameraX 还支持视频录制。要录制视频,开发者需要创建一个 VideoCapture 用例,并将其绑定到相机。以下是如何做到的:
// Create a video capture use case
val videoCaptureUseCase = VideoCapture.Builder()
.build()
// Bind the use cases to the camera
cameraProvider.bindToLifecycle(this, cameraSelector, previewUseCase, videoCaptureUseCase)
// Set up a listener for video capture events
videoCaptureUseCase.addVideoCaptureListener(cameraExecutor, object : VideoCapture.OnVideoCaptureListener() {
override fun onCaptureSuccess(video: VideoProxy) {
// Do something with the video
video.close()
}
override fun onError(error: VideoCaptureException) {
// Handle the error
}
})
使用 CameraX,开发者可以轻松地构建功能强大且易于使用的相机应用程序。CameraX 简化了摄像头功能的实现过程,并提供了一套一致的 API 接口,支持所有运行 Android 5.0 及以上的设备。