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 扩展 library
def camerax_ext_version = "1.0.0-alpha02"
implementation "androidx.camera:camera-core:$camerax_version"
//如果你要使用Camera2的扩展功能
implementation "androidx.camera:camera-camera2:$camerax_version"
// 如果你要使用 CameraX View
implementation "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>() {
@Override
public void accept(Boolean aBoolean) throws Exception {
if (aBoolean) {
//申请权限成功,操作
} else {
//申请权限失败,操作
}
}
});
}
页面布局
众所周知,无论是拍照前还是拍摄视频,我们都希望可以看到当前的预览,从而控制拍摄的效果,那么CameraX是通过啥东东来让我们进行预览操作的呢?答案是 它的 TextureView
,我们需要在进行预览的页面的布局XML里放入一个 TextureView
。
<RelativeLayout
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextureView
android: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() {
//拍摄预览的配置config
PreviewConfig.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);
//图片拍摄的配置config
ImageCaptureConfig.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() {
@Override
public void onUpdated(Preview.PreviewOutput output) {
//下面这一步很重要
//把预览的输出附加在自己的TextureView控件上,这样才可以看见预览
containerCamera.setSurfaceTexture(output.getSurfaceTexture());
}
});
//图像分析的具体操作
imageAnalysis.setAnalyzer(new ImageAnalysis.Analyzer() {
@Override
public void analyze(ImageProxy image, int rotationDegrees) {
// image 会不断传进来,你可以对它进行各种你想要的操作
}
});
拍摄、保存照片的操作比上面的多了一丢丢,不过也是灰常简单的!
//创建要存储照片的File,要记得检查权限的获取
String imageName = "QG7777777.png";
//下面是拍摄照片的输出与回调,可以绑定一个按钮的点击事件之类的
imageCapture.takePicture(createImageFile(imageName), new ImageCapture.OnImageSavedListener() {
@SuppressLint("CheckResult")
@Override
public void onImageSaved(@NonNull File file) {
//成功保存照片后的回调
}
@Override
public void onError(@NonNull ImageCapture.ImageCaptureError imageCaptureError, @NonNull String message, @Nullable Throwable cause) {
//保存照片失败后的回调
String errorMsg = "发生了未知的错误";
if(cause != null) {
errorMsg = cause.getMessage();
}
}
});
//保存指定名称的文件,绝对路径为"/storage/emulated/0/"+imageName
File 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() {
@Override
public 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这个功能了。
就是这么地简单,没有了以前的繁琐操作和适配问题。。
//拍摄预览的配置config
PreviewConfig.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());
//图片拍摄的配置config
ImageCaptureConfig.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家的文档。
Android JetPack组件-CameraX初探的更多相关文章
- Android Jetpack组件
带你领略Android Jetpack组件的魅力 Android新框架jetpack的内容讲解:Room.WorkManager.LifeCycles.LiveData.ViewModel.DataB ...
- Android Jetpack组件之Lifecycles库详解
Android Jetpack 组件是库的集合,这些库是为了协同工作而构建的,不过也可以单独采用,接下来会一一详细地学习这些库, 下面源码版本是com.android.support:appcompa ...
- Android Jetpack组件 - ViewModel,LiveData使用以及原理
本文涉及的源码版本如下: com.android.support:appcompat-v7:27.1.1 android.arch.lifecycle:extensions:1.1.1 android ...
- Android Jetpack 组建介绍(一)——Lifecycler
转自带你领略Android Jetpack组件的魅力 Android Jetpack 对于任何一个产品来说,我们开发中都会面对哪些问题?如:产品交互.用户体验.代码结构.数据获取.数据存储.网络优化. ...
- Android Jetpack 概述
Android Jetpack Overview Android Jetpack Jetpack is a set of libraries, tools and architectural guid ...
- 带你了解Android Jetpack
1.Jetpack主要特性有以下三点: 1.加速开发组件可单独使用,也可以协同工作,当使用kotlin语言特性时,可以提高效率. 2.消除样板代码Android Jetpack可管理繁琐的Activi ...
- 学习Android Jetpack? 入门教程和进阶实战这里全都有!
前言 2018年谷歌I/O,Jetpack横空出世,官方介绍如下: Jetpack 是一套库.工具和指南,可帮助开发者更轻松地编写优质应用.这些组件可帮助您遵循最佳做法.让您摆脱编写样板代码的工作并简 ...
- Android Jetpack Navigation基本使用
Android Jetpack Navigation基本使用 本篇主要介绍一下 Android Jetpack 组件 Navigation 导航组件的 基本使用 当看到 Navigation单词的时候 ...
- Android Jetpack 架构组件最佳实践之“网抑云”APP
背景 近几年,Android 相关的新技术层出不穷.往往这个技术还没学完,下一个新技术又出来了.很多人都是一脸黑人问号? 不少开发者甚至开始哀嚎:"求求你们别再创造新技术了,我们学不动了!& ...
随机推荐
- [ddt02篇]十年测试老鸟帮您解析:ddt结合txt,excel,csv,mysql实现自动化测试数据驱动
一.前言: 阅读此文之前请先阅读: [ddt01篇]十年测试老鸟帮您解析:ddt数据驱动入门基础应用:https://www.cnblogs.com/csmashang/p/12679448.html ...
- C语言实现链栈以及基本操作
链栈,即用链表实现栈存储结构.链栈的实现思路同顺序栈类似,顺序栈是将数顺序表(数组)的一端作为栈底,另一端为栈顶:链栈也如此,通常我们将链表的头部作为栈顶,尾部作为栈底,如下下图所示: 将链表头部作为 ...
- canvas 实现光线沿不规则路径运动
canvas 实现光线沿不规则路径运动 此文章为原创,请勿转载 1.svg实现 2.canvas实现 3.坑点 svg让动画沿着不规则路径运动 查阅svg文档后发现,svg动画运动有两种实现方式,且都 ...
- mysql的事务四个特性以及事务的四个隔离级别
一.事务四大属性 分别是原子性.一致性.隔离性.持久性. 1.原子性(Atomicity) 原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库, ...
- 【乱码问题】IDEA控制台使用了GBK字符集
什么Tomcat乱码设置IDEA的初始编码,瞎搞 终于在这个帖子看到了真相 https://blog.csdn.net/weixin_42617398/article/details/81806438 ...
- ValidForm.js的使用注意点
dataType的值不能为"", 否则会导致错误发生:Uncaught TypeError: Cannot read property '0' of null,http请求可以发送 ...
- Salesforce 学习 | 官方总结最实用的Spring '20新功能
在Spring '20正式发布之前,Trailblazers 社区举行了一个名为Treasure Hunt的在线活动,通过预览沙盒,分享他们认为Spring ‘20中最重要的功能.这篇文章就来盘点一下 ...
- 从python爬虫以及数据可视化的角度来为大家呈现“227事件”后,肖战粉丝的数据图
前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. PS:如有需要Python学习资料的小伙伴可以加点击下方链接自行获取t.cn ...
- Vue定义全局过滤器filter
这里介绍的是多个过滤器一起添加到全局中 1.创建方法 首先src下新建plugin文件夹,用来存放插件. 在plugin文件夹内新建filters.js,编写方法(如隐藏手机号码等等...) /** ...
- go 基础 结构体
结构体是类型中带有成员的复合类型.go语言使用结构体和结构体成员来描述真实世界的实体和实体对应的各种属性. go语言中的类型可以被实例化,使用new和&构造类型实例的类型是类型的指针. 结构体 ...