使用CameraX实现拍照
时间: 2023-10-23 17:13:01 浏览: 113
非常好的问题,使用CameraX可以轻松地实现拍照功能。首先需要在项目的build.gradle文件中添加以下依赖项:
```
implementation "androidx.camera:camera-core:1.0.0"
implementation "androidx.camera:camera-camera2:1.0.0"
```
然后,在XML布局文件中添加一个ImageView控件用于显示照片,以及一个Button控件用于触发拍照:
```
<ImageView
android:id="@+id/photo_view"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
<Button
android:id="@+id/camera_button"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Take Photo"/>
```
接下来,在Activity或Fragment中,可以使用以下代码来初始化CameraX,并启动相机预览:
```
val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener(Runnable {
val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()
// 创建 Preview 对象
val preview = Preview.Builder()
.build()
// 创建 ImageCapture 对象
val imageCapture = ImageCapture.Builder()
.build()
// 绑定预览对象和 ImageCapture 对象到相机上
val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
cameraProvider.unbindAll()
camera = cameraProvider.bindToLifecycle(this, cameraSelector, preview, imageCapture)
// 预览的 Surface
val previewSurfaceProvider = previewView.previewSurfaceProvider
preview.setSurfaceProvider(previewSurfaceProvider)
}, ContextCompat.getMainExecutor(this))
```
最后,在Button的Click事件中,可以使用以下代码来拍照:
```
val imageCapture = imageCapture ?: return@setOnClickListener
val photoFile = File(externalMediaDirs.first(), "${System.currentTimeMillis()}.jpg")
val outputOptions = ImageCapture.OutputFileOptions.Builder(photoFile).build()
imageCapture.takePicture(outputOptions, ContextCompat.getMainExecutor(this), object : ImageCapture.OnImageSavedCallback {
override fun onImageSaved(outputFileResults: ImageCapture.OutputFileResults) {
// 显示照片
val savedUri = Uri.fromFile(photoFile)
photo_view.post {
photo_view.setImageURI(savedUri)
}
}
override fun onError(exception: ImageCaptureException) {
// 错误处理
}
})
```
希望这些代码可以帮助您实现使用CameraX进行拍照。
阅读全文