Android相机基础开发快速实现1(拍照,录视频,加水印,扫描二维码)

最近项目中有一个拍照和录制视频加水印的需求,就整理了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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容