android点击按钮调用CameraX系统相机
时间: 2023-10-12 10:04:34 浏览: 151
使用 CameraX 调用系统相机,需要以下步骤:
1. 添加 CameraX 依赖项,可以在项目的 build.gradle 文件中添加以下代码:
```
dependencies {
def camerax_version = "1.0.0-beta06"
implementation "androidx.camera:camera-core:$camerax_version"
implementation "androidx.camera:camera-camera2:$camerax_version"
}
```
2. 在布局文件中添加一个按钮:
```
<Button
android:id="@+id/btn_camera"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="Open Camera" />
```
3. 在 Activity 或 Fragment 中添加以下代码:
```
private val REQUEST_CODE_CAMERA_PERMISSION = 1001
private lateinit var imageCapture: ImageCapture
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
setContentView(R.layout.activity_main)
// 检查相机权限
if (checkSelfPermission(Manifest.permission.CAMERA) != PackageManager.PERMISSION_GRANTED) {
requestPermissions(arrayOf(Manifest.permission.CAMERA), REQUEST_CODE_CAMERA_PERMISSION)
}
// 初始化 ImageCapture
val imageCaptureConfig = ImageCaptureConfig.Builder().apply {
setTargetRotation(windowManager.defaultDisplay.rotation)
}.build()
imageCapture = ImageCapture(imageCaptureConfig)
// 点击按钮调用相机
btn_camera.setOnClickListener {
val outputDirectory = getOutputDirectory()
val photoFile = File(outputDirectory, SimpleDateFormat(FILENAME_FORMAT, Locale.US).format(System.currentTimeMillis()) + ".jpg")
val options = ImageCapture.OutputFileOptions.Builder(photoFile).build()
imageCapture.takePicture(options, ContextCompat.getMainExecutor(this), object : ImageCapture.OnImageSavedCallback {
override fun onError(error: ImageCaptureException) {
Log.e(TAG, "Photo capture failed: ${error.message}", error)
}
override fun onImageSaved(output: ImageCapture.OutputFileResults) {
val savedUri = output.savedUri ?: Uri.fromFile(photoFile)
val intent = Intent(Intent.ACTION_VIEW, savedUri)
startActivity(intent)
}
})
}
}
// 获取输出目录
private fun getOutputDirectory(): File {
val mediaDir = externalMediaDirs.firstOrNull()?.let {
File(it, resources.getString(R.string.app_name)).apply { mkdirs() }
}
return if (mediaDir != null && mediaDir.exists()) mediaDir else filesDir
}
override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) {
super.onRequestPermissionsResult(requestCode, permissions, grantResults)
if (requestCode == REQUEST_CODE_CAMERA_PERMISSION && grantResults.isNotEmpty() && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
// 授权成功
}
}
```
在这段代码中,我们首先检查相机权限,然后初始化 `ImageCapture` 对象。当用户点击按钮时,我们使用 `ImageCapture` 对象拍摄照片,并将其保存到设备上。最后,我们使用 `Intent` 打开保存的照片。
需要注意的是,这里我们使用了 `androidx.camera:camera-camera2` 依赖项,因为它提供了更低级别的访问相机 API,可以更好地控制相机的行为。如果你想要更高级别的相机 API,可以尝试使用 `androidx.camera:camera-lifecycle` 依赖项。
阅读全文