(一)概述

CameraX 是Jetpack的相机组件,具有强大的参数支持和兼容性,可以实现视频拍摄、预览等操作,且API简单易用。

// cameraX
api 'androidx.camera:camera-core:1.0.0-alpha04'
api 'androidx.camera:camera-camera2:1.0.0-alpha04'
api 'androidx.camera:camera-view:1.0.0-alpha01'
api 'androidx.camera:camera-extensions:1.0.0-alpha01'
// gesture imageview
api 'com.github.chrisbanes:PhotoView:2.3.0@aar'

(二)示例代码

1.初始化相机

private fun bindCameraX() {// 取消绑定生命周期中的所有用例,并将其从CameraX中删除。CameraX.unbindAll()// 检查是否有后置摄像头var hasCameraWithLensFacing = falsetry {hasCameraWithLensFacing = CameraX.hasCameraWithLensFacing(mLensFacing)} catch (e: CameraInfoUnavailableException) {e.printStackTrace()}if (!hasCameraWithLensFacing) {InteractionPresenter.showToast("无设备cameraId!,请检查设备的相机是否被占用")return finish()}// 然后检查后置摄像头是否可用var cameraIdForLensFacing: String? = nulltry {cameraIdForLensFacing = CameraX.getCameraFactory().cameraIdForLensFacing(mLensFacing)} catch (e: CameraInfoUnavailableException) {e.printStackTrace()}if (TextUtils.isEmpty(cameraIdForLensFacing)) {InteractionPresenter.showToast("无可用的设备cameraId!,请检查设备的相机是否被占用")return finish()}// =====================重点=======================//// CameraX 视频预览val config = PreviewConfig.Builder().setLensFacing(mLensFacing) //前后摄像头.setTargetRotation(rotation)//旋转角度.setTargetResolution(resolution) //分辨率.setTargetAspectRatio(rational)//宽高比.build()preview = Preview(config)// 需要设置preview视频流回调事件,和textureview绑定。// 请注意textureview一定还要先移除再添加preview?.setOnPreviewOutputUpdateListener {val tv = binding.textureView(tv.parent as ViewGroup).run {removeView(tv)addView(tv, 0)}tv.setSurfaceTexture(it.surfaceTexture)textureView = tv}// CameraX 点击拍摄照片imageCapture = ImageCapture(ImageCaptureConfig.Builder().setTargetAspectRatio(rational).setTargetResolution(resolution).setLensFacing(mLensFacing).setTargetRotation(rotation).build())// CameraX 视频录制videoCapture = VideoCapture(VideoCaptureConfig.Builder().setTargetRotation(rotation).setLensFacing(mLensFacing).setTargetResolution(resolution).setTargetAspectRatio(rational).setVideoFrameRate(25) // 视频帧率.setBitRate(3 * 1024 * 1024).build()// bit率)// 上面配置的都是我们期望的分辨率val newUseList: MutableList<UseCase> = java.util.ArrayList()newUseList.add(preview!!)newUseList.add(imageCapture!!)newUseList.add(videoCapture!!)// 下面我们要查询一下 当前设备它所支持的分辨率有哪些,然后再更新一下 所配置的几个usecaseval resolutions = CameraX.getSurfaceManager().getSuggestedResolutions(cameraIdForLensFacing, null, newUseList)resolutions.forEach { (useCase, value) ->val suggestedResolutionMap = HashMap<String, Size>()suggestedResolutionMap[cameraIdForLensFacing!!] = valueuseCase.updateSuggestedResolution(suggestedResolutionMap)}// 最后绑定宿主生命周期CameraX.bindToLifecycle(this, preview, imageCapture, videoCapture)
}

2.视频全屏预览:

/*** 预览视频: 视频的全屏预览需要区分本地视频资源&网络视频资源*/
private fun previewVideo(previewUrl: String) {mPreviewBinding.playerView.visibility = View.VISIBLE// 播放器player = ExoPlayerFactory.newSimpleInstance(this,DefaultRenderersFactory(this),DefaultTrackSelector(),DefaultLoadControl())var uri: Uri? = nullval file = File(previewUrl)if (file.exists()) {// 如果是本地视频val dataSpec = DataSpec(Uri.fromFile(file))val fileDataSource = FileDataSource()try {fileDataSource.open(dataSpec)uri = fileDataSource.uri} catch (e: FileDataSourceException) {e.printStackTrace()}} else {// 网络视频uri = Uri.parse(previewUrl)}val factory = ProgressiveMediaSource.Factory(DefaultDataSourceFactory(this, Util.getUserAgent(this,packageName)))val mediaSource = factory.createMediaSource(uri)player?.apply {prepare(mediaSource)// 加载视频playWhenReady = true// 播放视频mPreviewBinding.playerView.player = this// playerView与player绑定}
}

3)图片全屏预览:

<!--图片的全屏预览我们使用PhotoView来实现,
请注意它的scaleType需要设置成fitCenter, 否则宽高可能会被裁减-->
<com.github.chrisbanes.photoview.PhotoViewandroid:id="@+id/photo_view"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_gravity="center"android:layout_marginTop="90dp"android:layout_marginBottom="@dimen/dp_60"android:scaleType="fitCenter"android:visibility="gone" />
// 预览图片
Glide.with(this).load(previewUrl).into(mPreviewBinding.photoView)

Jetpack系列之CameraX 相机相关推荐

  1. Jetpack系列之Navigation----入门(五)

    Jetpack系列之Navigation----入门(五) 使用 ViewPager 创建包含标签页的滑动视图 实现滑动视图 使用 TabLayout 添加标签页 使用 ViewPager2 创建包含 ...

  2. Jetpack系列之开胃菜

    前言 关于Jetpack系列文章本来早都有计划开写,无奈前段时间,项目紧张,连着凌晨一两点的赶项目,想着等项目上线了,终于可以歇一口气,可是又接连发生一些事,比如,正在解决bug的时候,被叫去开会,让 ...

  3. Camera开发系列之二 相机数据回调处理

    章节 Camera开发系列之一-显示摄像头实时画面 Camera开发系列之二-相机预览数据回调 Camera开发系列之三-相机数据硬编码为h264 Camera开发系列之四-使用MediaMuxer封 ...

  4. Android Jetpack系列之ViewModel

    ViewModel介绍 ViewModel的定义:ViewModel旨在以注重生命周期的方式存储和管理界面相关的数据.ViewModel本质上是视图(View)与数据(Model)之间的桥梁,想想以前 ...

  5. Android JetPack系列---Lifecycle

    Android JetPack系列-Lifecycle jetpack也出来很长一段时间了,最近比较闲,然后顺便记录一下自己的学习.然后准备打算的是写一个一系列的文章来完成自己对jetpack 的了解 ...

  6. Jetpack支持库CameraX使用入门——相机预览

    概览 CameraX是一个Jetpack支持库,用来帮助开发者简化相机应用的开发和适配工作,它将一系列旧的Camera和新的Camera2的相机API进行统一适配,将两套设计迥异的相机API进行适配设 ...

  7. 华为Mate 30系列后摄相机模组曝光:圆形三摄各有不同

    随着华为Mate30系列新机发布时间的临近,该机的大致外观和配置信息都差不多得到确认,总体上不会有太大的变化,新的爆料主要集中在部分细节方面.近日有媒体晒出了据称是华为Mate30系列新机的后置相机模 ...

  8. WebRTC 系列1--创建相机预览

    用 WebRTC 创建相机预览,不到 50 行核心代码就可以轻松搞定了. WebRTC 依赖版本 直接使用官方给的版本就好了,不需要再去额外编译. implementation 'org.webrtc ...

  9. 一加9系列发布,相机实力不容小觑

    在刚刚发布了的全新一加9系列,覆盖多个方面的升级.但与以往机型相比,其主要的发力部分由屏幕转移至了相机模块,这相信与当前市场上用户的拍照需求密不可分,也可以从中看出一加手机对用户. 一加此次与哈苏联名 ...

最新文章

  1. 无线路由器与无线AP的区别
  2. R语言函数:length计算长度、seq生成数据序列、rep将数据对象重复N遍复制、cut将连续变量分割为多水平的因子变量、pretty将连续变量x分成n个区间创建合适的断点、cat数据对象拼接
  3. m_Orchestrate learning system---九、在无法保证是否有图片的情况下,如何保证页面格式...
  4. Android SQlite数据库的使用(三)-将数据库文件连同应用程序一起发布
  5. 【Linux 内核】进程管理 task_struct 结构体 ② ( state 字段 | stack 字段 | pid 字段 | tgid 字段 | pid_links 字段 )
  6. 03 | 事务隔离:为什么你改了我还看不见?
  7. java8新特性_乐字节-Java8新特性-函数式接口
  8. 关系数据库SQL之可编程性函数(用户自定义函数)
  9. iOS APP网络分析之rvictl(可以捕捉除了Wifi以外的网络类型)
  10. CSS 类选择器详解——CSS 多类选择器
  11. java实验泛型与容器总结_【Java心得总结三】Java泛型上——初识泛型
  12. [django]list_display 中包含外键内的字段
  13. Centos7.6环境使用kubeadm部署kubernetes1.18.4
  14. Redis安装教程(保姆级详细图文)
  15. C# 中的浅拷贝和深拷贝
  16. python手写汉字识别项目_TensorFlow 2.0 中文手写字识别(汉字OCR)
  17. 与班尼特·胡迪一起攻破浮空城 (HZNU-2264)
  18. CURL命令参数详解
  19. Docker核心技术(一):镜像与容器
  20. F1DC2706蓝牙模块的射频特性及功耗测试

热门文章

  1. word连续打印连续编号_低成本连续碳纤维3D打印可以将金属从汽车中挤出?
  2. 【南瓜书ML】(task2)线性模型的数学推导(最小二乘估计、广义瑞利商、极大似然估计等)
  3. sdcms php版手册,sdcms常用手册汇总
  4. 一个CloudCC生态软件包的诞生:带你体验CloudCC生态-CSDN公开课-专题视频课程
  5. 解决 Description Resource Path Location Type Archive for required library
  6. 《电路分析基础》第1章 电路模型和电路元件 读书笔记
  7. 有没有前端小伙伴知道Cutterman为什么无法点击导出路径吗?
  8. maven下载(国内镜像)
  9. 四川大学计算机研究生学习氛围,川大清退上百名研究生,校方回应
  10. Python提取多个docx文本内容