最近项目中有一个拍照和录制视频加水印的需求,就整理了Android CameraX的相关方法,直接将所有功能封装成了一个开源库。使用方法非常简单,并且包含了拍照,录制视频,添加自定义水印,扫描二维码条形码所有功能,为了和各位一起节省时间避免重复造轮子。
PS:这个库依赖了Android Jetpack CameraX,Google MLKit 和 RXFFmpeg,体积小并且稳定。
PS:第一篇文章讲述拍照和录制视频基础用法,第二篇是图片和视频添加水印、扫描二维码等高级功能的使用方法
1.第一步Gradle导入依赖
dependencyResolutionManagement {
repositoriesMode.set(RepositoriesMode.FAIL_ON_PROJECT_REPOS)
repositories {
mavenCentral()
maven { url 'https://jitpack.io' }
}
}
依赖开源库的最新版本
implementation 'com.github.cgztzero:CameraxExtent:最新版本'
2.初始化方法
//首先在你的布局中加入相机预览view, 展示摄像头看到的画面
<cn.com.zt.camera.view.PreviewLayout
android:id="@+id/previewLayout"
android:layout_width="match_parent"
android:layout_height="match_parent" />
//第二步 创建一个相机的控制器
//controller用来操作相机拍照,录制,打开闪光灯等操作
private val controller = CameraControllerImpl()
//第三步 给previewLayout绑定lifecycle
//然后将Controller和previewLayout进行绑定后,最后通过Controller开启预览
previewLayout.bindToLifecycle(this)
controller.bindCameraPreview(binding.previewLayout)
controller.startPreview()
重要说明:Controller所有的操作必须是在和PreviewLayout绑定后进行的,否则会抛出异常
3.主要功能使用方法
3.1拍照
controller.takePicture(
object : ImageSavedCallback {
override fun onError(message: String?, code: Int) {
//拍照异常回调
}
override fun onImageSaved(originUri: Uri, bitmap: Bitmap?, watermarkFile: File?) {
//拍照成功后回调
//originUri照片文件的uri 后两个参数跟图片水印有关在第二篇文章 这里先不做说明
}
},
)
3.2录制视频
if (controller.isRecording()) {
controller.stopRecord()
} else {
controller.startRecord(
object : VideoSavedCallback {
override fun onVideoSaved(uri: Uri, watermarkFile: File?) {
//录制完成后视频文件的Uri 第二个参数是添加水印相关 第二篇文章介绍
}
override fun onError(videoCaptureError: Int, message: String, cause: Throwable?) {
//录制视频出错
}
override fun onWatermarkVideoProgressing(progress: Int, progressTime: Long) {
//给视频添加水印时的进度
}
}, )
}
3.3摄像头其他功能
//切换摄像头
controller.switchCamera()
//切换闪光灯为自动,打开和关闭
controller.setFlashMode(CameraConstant.FLASH_MODE_AUTO)
controller.setFlashMode(CameraConstant.FLASH_MODE_ON)
controller.setFlashMode(CameraConstant.FLASH_MODE_OFF)
4.对拍照和录制视频的一些选项配置,采用了构造者模式,可以随意配置存储文件的相关设置
val option = FileOutputOptions.Companion.FileOutputOptionsBuilder()
.setImageOutputDirectory("拍照文件存储的父路径")
.createImageName {
"拍照文件名字生成函数,返回值是String,需要包含后缀名"
}
.setVideoOutputDirectory("录制视频文件存储的父路径")
.createVideoName {
"视频文件名字生成函数,返回值是String,需要包含后缀名"
}
.setVideoMaxDuration(10 * 1000)//设置录制视频最大时长,毫秒
.build()
//设置参数生肖
previewLayout.setFileOutputOptions(option)
相机参数所有枚举
object CameraConstant {
//前后摄像头
const val LENS_FACING_FRONT = CameraSelector.LENS_FACING_FRONT
const val LENS_FACING_BACK = CameraSelector.LENS_FACING_BACK
//闪光灯模式
const val FLASH_MODE_AUTO = ImageCapture.FLASH_MODE_AUTO
const val FLASH_MODE_ON = ImageCapture.FLASH_MODE_ON
const val FLASH_MODE_OFF = ImageCapture.FLASH_MODE_OFF
//水印添加模式 图片视频都加 只图片加 只视频加
const val WATER_MARK_BOTH = 0
const val WATER_MARK_ONLY_IMAGE = 1
const val WATER_MARK_ONLY_VIDEO = 2
//水印位置枚举
const val WATER_POSITION_TOP_LEFT = 0
const val WATER_POSITION_TOP_RIGHT = 1
const val WATER_POSITION_BOTTOM_LEFT = 2
const val WATER_POSITION_BOTTOM_RIGHT = 3
const val WATER_POSITION_CENTER = 4
}
以上就是拍照和录制视频的使用方法,代码量瞬间下降了不少~
下一篇讲解给照片和视频加水印,以及扫描二维码功能的使用方法
第二篇文章传送门:https://www.jianshu.com/p/6be0c3303229
欢迎各位提bug和需求,感谢加星~
GitHub地址:
https://github.com/cgztzero/CameraxExtent/tree/master