android CameraX调用系统相机
时间: 2023-10-12 22:04:35 浏览: 43
使用 CameraX 调用系统相机可以通过 `CameraX` 库的 `CameraX.LifecycleCameraProvider` 类来实现。以下是调用系统相机的简单示例代码:
```kotlin
private var imageCapture: ImageCapture? = null
private fun startCamera() {
val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener(Runnable {
// 获取 CameraProvider
val cameraProvider = cameraProviderFuture.get()
// 获取相机实例
val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
val preview = Preview.Builder().build().also {
it.setSurfaceProvider(viewFinder.surfaceProvider)
}
imageCapture = ImageCapture.Builder().build()
try {
// 解绑之前绑定的相机
cameraProvider.unbindAll()
// 绑定新相机
cameraProvider.bindToLifecycle(
this as LifecycleOwner, cameraSelector, preview, imageCapture
)
} catch (exc: Exception) {
Log.e(TAG, "Use case binding failed", exc)
}
}, ContextCompat.getMainExecutor(this))
}
// 拍照
private fun takePhoto() {
val imageCapture = imageCapture ?: return
val photoFile = File(
outputDirectory,
SimpleDateFormat(FILENAME_FORMAT, Locale.US).format(System.currentTimeMillis()) + ".jpg"
)
val outputOptions = ImageCapture.OutputFileOptions.Builder(photoFile).build()
imageCapture.takePicture(
outputOptions, ContextCompat.getMainExecutor(this), object : ImageCapture.OnImageSavedCallback {
override fun onError(exc: ImageCaptureException) {
Log.e(TAG, "Photo capture failed: ${exc.message}", exc)
}
override fun onImageSaved(output: ImageCapture.OutputFileResults) {
val savedUri = Uri.fromFile(photoFile)
val msg = "Photo capture succeeded: $savedUri"
Toast.makeText(baseContext, msg, Toast.LENGTH_SHORT).show()
Log.d(TAG, msg)
}
})
}
```
以上代码中,`startCamera()` 方法用于启动相机,`imageCapture` 用于拍照,`takePhoto()` 方法用于触发拍照操作。在 `onCreate()` 方法中,你需要调用 `startCamera()` 方法来启动相机,然后在需要拍照的时候调用 `takePhoto()` 方法即可。请注意,你需要在 AndroidManifest.xml 文件中添加相机权限。
```xml
<uses-permission android:name="android.permission.CAMERA" />
```