CameraX使用详解:从入门到实战
创作时间:
作者:
@小白创作中心
CameraX使用详解:从入门到实战
引用
CSDN
1.
https://m.blog.csdn.net/qq_22120623/article/details/144373875
在移动应用开发中,集成相机功能是一个常见的需求。Google推出的CameraX库为开发者提供了一种简化且强大的方式来实现相机功能。本文将详细介绍CameraX的使用,包括其核心功能、配置方法以及特别是实时分析的实现。
CameraX简介
CameraX是一个Jetpack库,基于Camera2 API,但提供了更高层次的抽象,简化了开发过程。其优势包括:
- 简化开发:通过简化的API接口,减少了与设备特定配置的直接交互。
- 向后兼容:支持Android 5.0(API级别21)及以上的设备。
- 强大的功能:支持图像捕获、视频录制、实时分析等。
- 自动适配:自动处理设备差异,确保一致的体验。
项目配置
在开始使用CameraX之前,需要进行项目配置。
添加依赖
在build.gradle
文件中添加CameraX库的依赖项:
dependencies {
def camerax_version = "1.3.0-alpha06"
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-view:$camerax_version"
implementation "androidx.camera:camera-extensions:$camerax_version"
}
权限声明
在AndroidManifest.xml
中声明必要的权限:
<uses-permission android:name="android.permission.CAMERA" />
<uses-permission android:name="android.permission.RECORD_AUDIO" />
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
在运行时请求相机权限是必要的,以确保应用能够访问设备的相机硬件。
CameraX基本用法
初始化相机
CameraX的核心组件是ProcessCameraProvider
,它控制相机的生命周期和用例绑定。
private fun startCamera() {
val cameraProviderFuture = ProcessCameraProvider.getInstance(this)
cameraProviderFuture.addListener(Runnable {
val cameraProvider: ProcessCameraProvider = cameraProviderFuture.get()
val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
val preview = Preview.Builder().build().also {
it.setSurfaceProvider(viewFinder.surfaceProvider)
}
try {
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(
this, cameraSelector, preview
)
} catch(exc: Exception) {
Log.e(TAG, "Use case binding failed", exc)
}
}, ContextCompat.getMainExecutor(this))
}
图像捕获
除了预览之外,CameraX还支持图像捕获,通过ImageCapture
用例实现。
private fun takePhoto() {
val imageCapture = ImageCapture.Builder().build()
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)
Log.d(TAG, "Photo capture succeeded: $savedUri")
}
}
)
}
实时分析的使用
实时分析是CameraX的一项强大功能,它允许开发者实时处理相机视频流,例如用于二维码扫描、面部识别或其他图像处理任务。通过ImageAnalysis
用例实现。
设置实时分析
首先,创建一个ImageAnalysis
实例,并设置其分析器:
private fun setupImageAnalysis() {
val imageAnalysis = ImageAnalysis.Builder()
.setBackpressureStrategy(ImageAnalysis.STRATEGY_KEEP_ONLY_LATEST)
.build()
imageAnalysis.setAnalyzer(ContextCompat.getMainExecutor(this), ImageAnalysis.Analyzer { imageProxy ->
processImage(imageProxy)
})
val cameraProvider = ProcessCameraProvider.getInstance(this).get()
val cameraSelector = CameraSelector.DEFAULT_BACK_CAMERA
try {
cameraProvider.unbindAll()
cameraProvider.bindToLifecycle(this, cameraSelector, imageAnalysis)
} catch (exc: Exception) {
Log.e(TAG, "Binding failed", exc)
}
}
处理图像
在processImage
方法中,实现图像分析的具体逻辑:
private fun processImage(imageProxy: ImageProxy) {
// 获取图像数据
val mediaImage = imageProxy.image
if (mediaImage != null) {
// 在此处进行图像处理,例如使用ML Kit进行二维码扫描或面部识别
// val image = InputImage.fromMediaImage(mediaImage, imageProxy.imageInfo.rotationDegrees)
// 处理完成后关闭imageProxy
imageProxy.close()
}
}
在这个过程中,关键是要在处理完每一帧图像后调用imageProxy.close()
,以释放资源并允许下一帧的处理。
高级功能
扩展功能
CameraX支持多种扩展功能,例如HDR、夜景模式等。这些功能可以通过camera-extensions
库启用。
val hdrImageCapture = ImageCapture.Builder()
.setCaptureMode(ImageCapture.CAPTURE_MODE_MAXIMIZE_QUALITY)
.setHdrEnabled(true)
.build()
自定义UI
CameraX提供了默认的CameraView
,但开发者可以完全自定义用户界面,以满足特定的设计需求。
<androidx.camera.view.PreviewView
android:id="@+id/viewFinder"
android:layout_width="match_parent"
android:layout_height="match_parent" />
热门推荐
汽车车船税详解:计算、缴纳及注意事项指南
MagicDance采用两阶段策略,实现高质量人体运动迁移
全国10所艺术院校齐聚国家大剧院,演绎“春华秋实”精品剧目
《蛟龙行动》抵制风波:营销失误、饭圈造谣下的品质之作
张涵予和林超贤联手,揭秘《蛟龙行动》背后的“机密”
警服新革命:智能科技与时尚设计的完美融合
宁波港危险品箱燃爆,高温天气下运输安全敲警钟
企业安全隐患排查治理指南:八大环节确保安全生产
八步排查五策实施,企业安全生产风险识别全指南
企业风险管理:五大要素构建稳健运营体系
梅花鹿肉的营养价值
东汉末年最贪皇帝刘宏:大兴土木搜刮民财,权力腐败的前车之鉴
最新研究:贪婪者的短暂自豪感形成无止境欲望循环
新雪季开启,东北滑雪场升级服务吸引南方客
时空交错演绎红色传承,深圳原创音乐剧《心中的歌》首演
保胃健康 | 秋冬口干舌燥?它可直接饮用或炖汤,清润养身
隋朝统一:改写中国历史进程的关键篇章
隋朝文化融合启示录:从制度创新到思想解放
甘麦枣仁膏详解:张仲景方剂改良版,助眠安神效果好
五种疗法改善失眠:从中药调理到运动治疗
冬季泡脚有讲究:5款中药方和禁忌人群全解析
深圳退休办理攻略:7个步骤轻松搞定
Paras肉桂粉铅超标,你还敢用吗?
Paras和EGN肉桂粉铅超标,如何防范?
《情感无能》| 逃不开的情感困局,如何走出无力感?
消防演练必备神曲:《The Final Countdown》
南宁探秘:青秀山下的千年秘密
南宁三大打卡圣地,你最想去哪个?
南宁南湖公园&朝阳路必打卡
南宁周末自然景观打卡攻略:从青秀山到江边,尽享绿城之美