使用cameraX 仿一甜相机
1、导入相关库
2、绑定LifeCycle生命周期并开启预览流
3、绑定ImageCapture图形捕捉以及VideoCapture视频帧捕捉
4、拍照
5、录像
6、聚焦
7、切换摄像头
8、缩放
9、闪光灯
10、照明、补光
11、Extensions 扩展程序使用
前言
CameraX 是jetpack 组件库中的一个非常重要的API,不同于Camera和Camera2,CameraX 在api解耦性上做出了非常大的调整。其中:
- 1、新增了生命周期绑定管理,解决了老版本Camera的内存泄漏问题
- 2、分辨率自动找寻最接近匹配问题,解决了开发者手动去查询支持分辨率列表(从中去找寻最匹配的分辨率)
- 3、增加ImageAnalysis图像分析,可以在图像输出前对像素进行YUV 转换并且预处理等操作
- 4、增加了 Extensions 扩展程序包括(AUTO、HDR、焦外成像(BOKEH)、夜景(NIGHT)、脸部照片修复(FACE_RETOUCH))等模式,当然,目前国内手机厂商都还没兼容当前的扩展模式,大部分还只有三星手机支持。期待
手机厂商抓紧适配,减少不必要的算法融合。
以上的一些新增内容,足够我们去替换老板本的Camera或者Camera2 Api。下面就是CameraX 的基础用法和Extensions 用法。
CameraX仿一甜相机


- 1、导入相关库
def camerax_version = "1.2.0-alpha04"
implementation "androidx.camera:camera-core:${camerax_version}"
implementation "androidx.camera:camera-camera2:${camerax_version}"
implementation "androidx.camera:camera-lifecycle:${camerax_version}"
implementation "androidx.camera:camera-video:${camerax_version}"
implementation "androidx.camera:camera-view:${camerax_version}"
implementation "androidx.camera:camera-extensions:${camerax_version}"
- 2、绑定LifeCycle生命周期并开启预览流
fun openCamera(){
val cameraProviderFuture = ProcessCameraProvider.getInstance(mLifecycleOwner!!)
cameraProviderFuture.addListener({
// 绑定生命周期
val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()
// Preview 预览流
val preview = Preview.Builder()
.build()
.also {
it.setSurfaceProvider(preview?.surfaceProvider)
}
//选择后置摄像头
val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
try {
//解绑所有摄像头使用
cameraProvider.unbindAll()
// 绑定输出
camera = cameraProvider.bindToLifecycle(
mLifecycleOwner!!, cameraSelector, preview
)
} catch (exc: Exception) {
Log.e(TAG, "Use case binding failed", exc)
}
}, ContextCompat.getMainExecutor(mLifecycleOwner!!))
}
- 3、绑定ImageCapture图形捕捉以及VideoCapture视频帧捕捉
//图像捕捉
imageCapture = ImageCapture.Builder()
.setCaptureMode(ImageCapture.CAPTURE_MODE_MAXIMIZE_QUALITY)
.build()
// 绑定输出
camera = cameraProvider.bindToLifecycle(
mLifecycleOwner!!, cameraSelector, imageCapture, preview
)
- 4、拍照
override fun takePhoto() {
val imageCapture = imageCapture ?: return
val name = SimpleDateFormat("yyyy-MM-dd", Locale.US)
.format(System.currentTimeMillis())
val contentValues = ContentValues().apply {
put(MediaStore.MediaColumns.DISPLAY_NAME, name)
put(MediaStore.MediaColumns.MIME_TYPE, "image/jpeg")
if (Build.VERSION.SDK_INT > Build.VERSION_CODES.P) {
put(MediaStore.Images.Media.RELATIVE_PATH, "Pictures/CameraX-Image")
}

本文详细介绍了如何使用Jetpack CameraX库实现类似一甜相机的功能,包括预览、拍照、录像、聚焦、切换摄像头、缩放、闪光灯、照明补光及Extensions扩展程序的使用。通过实例代码演示了生命周期管理、图像捕捉和视频录制的完整流程。
最低0.47元/天 解锁文章
1217





