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家的文档。

Google的开发者文档:CameraX

Android JetPack组件-CameraX初探的更多相关文章

  1. Android Jetpack组件

    带你领略Android Jetpack组件的魅力 Android新框架jetpack的内容讲解:Room.WorkManager.LifeCycles.LiveData.ViewModel.DataB ...

  2. Android Jetpack组件之Lifecycles库详解

    Android Jetpack 组件是库的集合,这些库是为了协同工作而构建的,不过也可以单独采用,接下来会一一详细地学习这些库, 下面源码版本是com.android.support:appcompa ...

  3. Android Jetpack组件 - ViewModel,LiveData使用以及原理

    本文涉及的源码版本如下: com.android.support:appcompat-v7:27.1.1 android.arch.lifecycle:extensions:1.1.1 android ...

  4. Android Jetpack 组建介绍(一)——Lifecycler

    转自带你领略Android Jetpack组件的魅力 Android Jetpack 对于任何一个产品来说,我们开发中都会面对哪些问题?如:产品交互.用户体验.代码结构.数据获取.数据存储.网络优化. ...

  5. Android Jetpack 概述

    Android Jetpack Overview Android Jetpack Jetpack is a set of libraries, tools and architectural guid ...

  6. 带你了解Android Jetpack

    1.Jetpack主要特性有以下三点: 1.加速开发组件可单独使用,也可以协同工作,当使用kotlin语言特性时,可以提高效率. 2.消除样板代码Android Jetpack可管理繁琐的Activi ...

  7. 学习Android Jetpack? 入门教程和进阶实战这里全都有!

    前言 2018年谷歌I/O,Jetpack横空出世,官方介绍如下: Jetpack 是一套库.工具和指南,可帮助开发者更轻松地编写优质应用.这些组件可帮助您遵循最佳做法.让您摆脱编写样板代码的工作并简 ...

  8. Android Jetpack Navigation基本使用

    Android Jetpack Navigation基本使用 本篇主要介绍一下 Android Jetpack 组件 Navigation 导航组件的 基本使用 当看到 Navigation单词的时候 ...

  9. Android Jetpack 架构组件最佳实践之“网抑云”APP

    背景 近几年,Android 相关的新技术层出不穷.往往这个技术还没学完,下一个新技术又出来了.很多人都是一脸黑人问号? 不少开发者甚至开始哀嚎:"求求你们别再创造新技术了,我们学不动了!& ...

随机推荐

  1. mysql全文索引浅谈

    原文链接:http://www.cnblogs.com/robertsun/p/5999588.html 对于一些简单的检索可以通过mysql自带的全文索引及 MATCH AGAINST 查询语句实现 ...

  2. 搭建环境-Eclipse配置Tomcat创建Servlet总结

    Descripton:Web开发:Eclipse的下载与安装,Tomcat下载和结合Eclipse的使用,Eclipse使用Servlet[记录下总结下] 一.Eclipse的下载与安装 下载地址 注 ...

  3. 2020-3-15 20175110王礼博 Exp2后门原理与实践

    目录 1.使用netcat获取主机操作Shell,cron启动 2.使用socat获取主机操作Shell, 任务计划启动 3.使用MSF meterpreter(或其他软件)生成可执行文件,利用nca ...

  4. pgsql中的行锁

    pgsql中的行锁 前言 用户可见的锁 regular Lock 行级别 FOR UPDATE FOR NO KEY UPDATE FOR SHARE FOR KEY SHARE 测试下加锁之后的数据 ...

  5. webWMS开发过程记录(一)- 软件开发的流程

    前言:计划开发一个webWMS,并将开发过程比较完整的记录下来.希望可以完成这个目标 软件开发的流程: 1. 了解该项目的相关概念. 了解所要开发的软件属于什么产品.该产品的基本定义是什么?基本功能模 ...

  6. three.js中让模型自动居中的代码如下:

    //load_Model为需要居中的3D模型 //原理是通过boundingBoxHelper 来计算模型的大小范围 var hex = 0xff0000; var MD_Length,MD_Widt ...

  7. 如何使用python进行自动网上考试

    前言 文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: HIS Hacker PS:如有需要Python学习资料的小伙伴可以 ...

  8. 带权值的图 BFS

    用bfs遍历最图求最短路径时通常借用优先队列即优先考虑最大的或者最小的权值 方法1 优先队列:(内置函数,优先考虑较小的权值) #include<iostream> #include< ...

  9. 原创zookeeper3.4.6集群安装

    tar -zxvf zookeeper-3.4.6.tar.gz -C /home/hadoop/ vi ~/.bash_profile export ZOOKEEPER_HOME=/home/had ...

  10. Kaggle入门——泰坦尼克号生还者预测

    前言 这个是Kaggle比赛中泰坦尼克号生存率的分析.强烈建议在做这个比赛的时候,再看一遍电源<泰坦尼克号>,可能会给你一些启发,比如妇女儿童先上船等.所以是否获救其实并非随机,而是基于一 ...