Android JetPack组件-CameraX初探
CameraX 又是一个 Google 推出的 JetPack 组件 ,是一个新鲜玩意儿,故给大家分享下我在项目中的使用过程心得。。
CameraX 是什么?
Google 开发者文档 对 CameraX 的评价如下:
CameraX是一个Jetpack支持库,旨在帮助您简化相机应用程序的开发工作。它提供一致且易于使用的API接口,适用于大多数Android设备,可以向后兼容至Android 5.0(API等级21)。
虽然它利用的是camera2的功能,但使用的是更为简单且基于用例的方法,该方法具有生命周期感知能力。它还解决了设备兼容性问题,因此您无需在代码库中包含设备专有代码。这些功能减少了将相机功能添加到应用时需要编写的代码量。
最后,通过CameraX,开发者只需两行代码即可利用与预安装的相机应用相同的相机体验和功能 CameraX扩展 是可选插件,通过该插件,您可以在支持的设备上向自己的应用中添加人像,HDR,夜间模式和美颜等效果。
本人的愚见:CameraX 是 Google 为了解决开发者们开发有关相机功能时遇到诸如适配等各种问题的一件称手的兵器。。
CameraX 入门
CameraX 还在测试alpha阶段,截至目前核心库最新的版本是 1.0.0-alpha05
,估计Google未来会继续修复现有的bug和推出稳定版(我也不知道啥时候?)。
CameraX 在项目中使用
CameraX 是 基于 Camera2 构建的,内部实现细节很多与Google之前推出的Camera2相同,所以说之前使用过Camera2 的旁友们对于 CameraX 可能会有一种亲切感hhh。而对于没有接触过Camera2或者说没有接触过相机功能开发的小?伴们,相信我,CameraX 入门的确是很简单,很简单,很简单。
有关下面的代码是用 Java 实现的,相信使用 Kotlin的小伙伴,也能一看就懂,网上的资料也大部分是Kotlin的?
CameraX 依赖
首先是要在 build.gradle(Module:app)
添加 以下的依赖,可以根据具体的需求添加?
// CameraX 核心库def camerax_version = "1.0.0-alpha05"// CameraX view def camerax_view_version = "1.0.0-alpha02"// CameraX 扩展 librarydef camerax_ext_version = "1.0.0-alpha02"implementation "androidx.camera:camera-core:$camerax_version"//如果你要使用Camera2的扩展功能implementation "androidx.camera:camera-camera2:$camerax_version"// 如果你要使用 CameraX Viewimplementation "androidx.camera:camera-view:$camerax_view_version"// 如果你要使用 CameraX 的 扩展功能implementation "androidx.camera:camera-extensions:$camerax_ext_version"//申请权限implementation 'com.tbruyelle.rxpermissions2:rxpermissions:0.9.5'
CameraX 获取权限
使用CameraX还是需要我们声明和动态申请的,毕竟我们还是会使用相机这个东西。
1、在 AndroidManifest.xml
里 注册相关的权限,相信大家都懂的~
<uses-permission android:name="android.permission.CAMERA"/><uses-feature android:name="android.permission.camera"/><uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /><uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
2、在你的项目中合适的地方,动态申请下相关的权限
为了方便省事,我使用了 RxPermissons
这个库进行动态申请权限和权限的管理
@SuppressLint("CheckResult")public void initPermission() {
RxPermissions rxPermissions = new RxPermissions(this); rxPermissions.request( Manifest.permission.CAMERA, Manifest.permission.WRITE_EXTERNAL_STORAGE, Manifest.permission.READ_EXTERNAL_STORAGE).subscribe(new Consumer<Boolean>() {@Overridepublic void accept(Boolean aBoolean) throws Exception {if (aBoolean) {//申请权限成功,操作} else {//申请权限失败,操作}}});}
页面布局
众所周知,无论是拍照前还是拍摄视频,我们都希望可以看到当前的预览,从而控制拍摄的效果,那么CameraX是通过啥东东来让我们进行预览操作的呢?答案是 它的 TextureView
,我们需要在进行预览的页面的布局XML里放入一个 TextureView
。
<RelativeLayoutandroid:orientation="vertical"android:layout_width="match_parent"android:layout_height="match_parent"><TextureViewandroid:id="@+id/containerCamera"android:layout_width="match_parent"android:fitsSystemWindows="true"android:layout_height="match_parent"/></RelativeLayout>
那么预览的输出到时候就会在这个 TextureView
上展示出来。
重头戏来了,怎么让相机打开看到图像并且可以保存拍摄的照片呢
1、 CameraX 的配置 (告诉 CameraX ,你想要做什么)
CameraX 可以做的事情,总体来说分三个部分–图像预览PreView,图像分析Analyze,图像拍摄Capture。
我们要分别对它们进行配置,告诉 CameraX 我们要怎么用它们。
ImageCapture类、ImageAnalysis类、Preview类的对象就是我们具体操作使用的对象
配置过程如下:
ImageCapture imageCapture;ImageAnalysis imageAnalysis;Preview preview;void initCameraConfig() {//拍摄预览的配置configPreviewConfig.Builder configBuilder = new PreviewConfig.Builder().setLensFacing(CameraX.LensFacing.BACK);preview = new Preview(configBuilder.build());//图片分析的配置config,Size对象里面分辨率,CameraX会自动找最适合当前设备的分辨率ImageAnalysisConfig imageAnalysisConfig = new ImageAnalysisConfig.Builder().setTargetResolution(new Size(1080,2248)).build();imageAnalysis = new ImageAnalysis(imageAnalysisConfig);//图片拍摄的配置configImageCaptureConfig.Builder captureBuilder = new ImageCaptureConfig.Builder().setLensFacing(CameraX.LensFacing.BACK);imageCapture = new ImageCapture(captureBuilder.build());}
2、如何使用ImageCapture类、ImageAnalysis类、Preview类的对象呢?
首先要把它们加入到 LifeCycle上管理
CameraX.bindToLifecycle(getSelf(), preview, imageAnalysis, imageCapture);
然后为它们注册绑定相关的事件
首先是 图像预览 和 图像分析 的事件
//图像预览的具体操作preview.setOnPreviewOutputUpdateListener(new Preview.OnPreviewOutputUpdateListener() {@Overridepublic void onUpdated(Preview.PreviewOutput output) {//下面这一步很重要//把预览的输出附加在自己的TextureView控件上,这样才可以看见预览containerCamera.setSurfaceTexture(output.getSurfaceTexture());}});//图像分析的具体操作imageAnalysis.setAnalyzer(new ImageAnalysis.Analyzer() {@Overridepublic void analyze(ImageProxy image, int rotationDegrees) {// image 会不断传进来,你可以对它进行各种你想要的操作}});
拍摄、保存照片的操作比上面的多了一丢丢,不过也是灰常简单的!
//创建要存储照片的File,要记得检查权限的获取String imageName = "QG7777777.png";//下面是拍摄照片的输出与回调,可以绑定一个按钮的点击事件之类的imageCapture.takePicture(createImageFile(imageName), new ImageCapture.OnImageSavedListener() {@SuppressLint("CheckResult")@Overridepublic void onImageSaved(@NonNull File file) {//成功保存照片后的回调}@Overridepublic void onError(@NonNull ImageCapture.ImageCaptureError imageCaptureError, @NonNull String message, @Nullable Throwable cause) {//保存照片失败后的回调String errorMsg = "发生了未知的错误";if(cause != null) {errorMsg = cause.getMessage();}}});//保存指定名称的文件,绝对路径为"/storage/emulated/0/"+imageNameFile createImageFile(String imageName) {return new File(Environment.getExternalStorageDirectory(),imageName);}
好啦,按步骤做到这里,你已经可以拍摄出一张由CameraX 拍摄的照片了。
还不够,想要更多的基础操作?
CameraX 也支持很多的基础操作,下面以 1.0.0-alpha05
已经支持的 点击对焦 操作为例
CameraX 将对焦操作,(我认为的) 浓缩成了三步:
1、获取用户点击画面区域的屏幕坐标
2、将屏幕坐标系的坐标转换为CameraX能读懂的坐标
3、告诉CameraX ,你想要开启点击对焦操作(配置)
对焦操作很简单,获取点击画面区域的坐标方法很多很多,我的代码,参考如下:
/***点击画面区域进行对焦操作的实现*/
containerCamera.setOnTouchListener(new View.OnTouchListener() {@Overridepublic boolean onTouch(View v, MotionEvent event) {TextureViewMeteringPointFactory pointFactory = new TextureViewMeteringPointFactory(containerCamera);MeteringPoint meteringPoint = pointFactory.createPoint(event.getX(),event.getY());FocusMeteringAction action = FocusMeteringAction.Builder.from(meteringPoint).build();try { CameraX.getCameraControl(CameraX.LensFacing.BACK).startFocusAndMetering(action);} catch (CameraInfoUnavailableException e) {e.printStackTrace();}return false;}});
扩展功能,Extensions ?
没错,CameraX 还支持 很多 扩展的功能,诸如开启 HDR ,开启 人像 模式,开启 **美颜模式 **等等等。。
CameraX 将扩展功能的开启 也 大大浓缩了,而且会自动判断设备是否支持开启。o( ̄▽ ̄)d
下面以开启 HDR 为例,让我们回到 配置 config 那一块
首先检查自己的 build.gradle(Module:app)
有没有 CameraX extensions 插件的依赖,没有的先补上。
在创建preview 和 imageCapture 对象的时候就把 我们想要 开启HDR 操作 告诉 CameraX,它就会帮我们检测设备是否支持并开启HDR这个功能了。
就是这么地简单,没有了以前的繁琐操作和适配问题。。
//拍摄预览的配置configPreviewConfig.Builder configBuilder = new PreviewConfig.Builder().setLensFacing(CameraX.LensFacing.BACK);HdrPreviewExtender hdrPreviewExtender = HdrPreviewExtender.create(configBuilder);//拍摄预览,开启HDR,判断硬件条件是否支持开启,是则直接开启if(hdrPreviewExtender.isExtensionAvailable()) {hdrPreviewExtender.enableExtension();}preview = new Preview(configBuilder.build());//图片拍摄的配置configImageCaptureConfig.Builder captureBuilder = new ImageCaptureConfig.Builder().setLensFacing(CameraX.LensFacing.BACK);HdrImageCaptureExtender hdrImageCaptureExtender = HdrImageCaptureExtender.create(captureBuilder);//拍摄照片,开启HDR,判断硬件条件是否支持开启,是则直接开启if(hdrImageCaptureExtender.isExtensionAvailable()) {hdrImageCaptureExtender.isExtensionAvailable();}imageCapture = new ImageCapture(captureBuilder.build());
总结
CameraX 是 Google 推出的一个挺不错的 JetPack 组件,入门真的非常简单,使用起来很方便,节省了很多开发时间。而且绑定了LifeCycle ,因此生命周期管理也挺省事。
虽说目前还不太成熟,但毕竟它还在测试阶段,Google未来还会修复bug和推出新功能,期待它的未来~
这篇文章只是介绍了CameraX的入门操作,想要了解更多和获取最新的信息,请前往Google家的文档。
Google的开发者文档:CameraX
Android JetPack组件-CameraX初探相关推荐
- Android Jetpack组件之Hilt使用
前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. And ...
- Android Jetpack组件App Startup简析
1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...
- Android Jetpack组件之WorkManger使用介绍
1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...
- Android Jetpack组件之Navigation使用-源码
1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...
- Android Jetpack组件之 Room使用-源码
1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...
- Android Jetpack组件之 Paging使用-源码
1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...
- Android Jetpack组件之 LiveData使用-源码
1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...
- Android Jetpack组件之ViewModel使用
1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...
- Android Jetpack 组件之 Lifecycle源码
1.前言 最近简单看了下google推出的框架Jetpack,感觉此框架的内容可以对平时的开发有很大的帮助,也可以解决很多开发中的问题,对代码的逻辑和UI界面实现深层解耦,打造数据驱动型UI界面. A ...
最新文章
- 浅谈Django的中间件与Python的装饰器
- RxSwift 之过滤操作
- 《Android 游戏开发大全(第二版)》——6.4节角色扮演游戏
- 3 帮助命令、用户管理、压缩
- 计算机应用基础的听课记录,听课记录-计算机应用基础
- html默认下面,阅读下面配置web默认页面index.html的代码 index.html 下面选项中,说法正确的是() (多选)...
- 二叉树的概念和基本术语
- PHP代码审计工具RIPS
- 安捷伦电源6319D实现GPIB通信
- 网站为什么要备案?网站备案流程是什么?
- Simpson自适应Simpson
- 2018语言排行榜php,世界编程语言排行榜_TIOBE:2019年12月全球编程语言排行榜
- SDWAN-虚拟网卡(最全详解)
- 如何打包c#编写的程序
- java---File类笔记(简单介绍)
- 第 11 章 一 执行引擎概述、解释器、JIT编译器-热点代码优化
- 解决微信环境下无法通过链接唤起App Store、微信访问App Store 链接白屏问题
- Python环境搭建系列
- 计算机管理用户和组无法访问,用户和组管理权限及文件访问控制
- 找不到和chrome浏览器版本不同的chromedriver的解决方法
热门文章
- 【调剂】浙江师范大学机械工程需要调剂部分机械类、自动化类、材料加工类等学术研究生...
- SpringBoot part4 day04
- JavaScript常用关键字
- 广州.NET微软技术俱乐部休闲活动 - 每周三五晚周日下午爬白云山活动
- 论文翻译:基于端到端的可训练神经网络基于图像的序列识别及其在场景文本识别中的应用
- 博客园自动发帖--图像处理极验验证码
- pku1160 Post Office
- 这6个自学网站在知乎得到40万的热推!凭什么?看了就知道!
- 10M/S+百度网盘不限速,一次性安排4个软件,手机电脑全覆盖!
- 对表空间 'USERS' 无权限