Jetpack支持库 CameraX 初体验

1、CameraX 概览

CameraX 概览

CameraX 使用入门

CameraX 是一个 Jetpack 支持库,旨在帮助您简化相机应用的开发工作。它提供一致且易于使用的 API 界面,适用于大多数 Android 设备,并可向后兼容至 Android 5.0(API 级别 21)。

虽然它利用的是 camera2 的功能,但使用的是更为简单且基于用例的方法,该方法具有生命周期感知能力。它还解决了设备兼容性问题,因此您无需在代码库中包含设备专属代码。这些功能减少了将相机功能添加到应用时需要编写的代码量。

最后,借助 CameraX,开发者只需两行代码就能利用与预安装的相机应用相同的相机体验和功能。 CameraX Extensions 是可选插件,通过该插件,您可以在支持的设备上向自己的应用中添加人像、HDR、夜间模式和美颜等效果。

2、CameraX 使用

2.1、CameraX 具有以下最低版本要求:

  • Android API 级别 21
  • Android 架构组件 1.1.1

2.2、使用 CameraX

开发者使用 CameraX,借助名为“用例”的抽象概念与设备的相机进行交互。目前提供的用例如下:

  • 预览:准备一个预览 SurfaceTexture
  • 图片分析:提供 CPU 可访问的缓冲区以进行分析(例如进行机器学习)
  • 图片拍摄:拍摄并保存照片

注意:一定要先申请、开启 Camera 权限:

<uses-permission android:name="android.permission.CAMERA" />

2.2.1、实现预览:

预览用例会生成一个 SurfaceTexture 以流式传输相机输入。它还提供对 View 进行剪裁、缩放或旋转以确保其正常显示所需的其他信息。

当相机处于活动状态时,图片预览就会流式传输到此 SurfaceTexture。可将 SurfaceTexture 连接到 TextureView 或 GLSurfaceView。

PreviewConfig --> Preview

    PreviewConfig config = new PreviewConfig.Builder().build();
    Preview preview = new Preview(config);

    preview.setOnPreviewOutputUpdateListener(
        new Preview.OnPreviewOutputUpdateListener() {
            @Override
            public void onUpdated(Preview.PreviewOutput previewOutput) {
                // Your code here. For example, use previewOutput.getSurfaceTexture()
                // and post to a GL renderer.
        });
    });

    CameraX.bindToLifecycle((LifecycleOwner) this, preview);

2.2.2、分析图片:

图片分析用例为您的应用提供了可供 CPU 访问以执行图片处理、计算机视觉或机器学习推断的图片。该应用会实现在每个帧上运行的 Analyzer 方法。

ImageAnalysisConfig --> ImageAnalysis

    ImageAnalysisConfig config =
        new ImageAnalysisConfig.Builder()
            .setTargetResolution(new Size(1280, 720))
            .build();

    ImageAnalysis imageAnalysis = new ImageAnalysis(config);

    imageAnalysis.setAnalyzer(
        new ImageAnalysis.Analyzer() {
            @Override
            public void analyze(ImageProxy image, int rotationDegrees) {
                // insert your code here.
            }
    });
    CameraX.bindToLifecycle((LifecycleOwner) this, imageAnalysis, preview);
   

2.2.3、图片拍摄:

图片拍摄用例旨在拍摄高分辨的优质照片,不仅提供简单的相机手动控制功能,还提供自动白平衡、自动曝光和自动对焦 (3A) 功能。调用程序负责决定如何使用拍摄的照片,包括以下选项:

  • takePicture(OnImageCapturedListener):此方法用于为拍摄的图片提供内存缓冲区。
  • takePicture(File, OnImageSavedListener):此方法将拍摄的图片保存到提供的文件位置。
  • takePicture(File, OnImageSavedListener, Metadata):您可以此方法指定要嵌入已保存文件的 Exif 中的元数据。

ImageCaptureConfig --> ImageCapture

    ImageCaptureConfig config =
        new ImageCaptureConfig.Builder()
            .setTargetRotation(getWindowManager().getDefaultDisplay().getRotation())
            .build();

    ImagesCapture imageCapture = new ImageCapture(config);
   

2.2.4、将用例绑定到生命周期

 //将用例绑定到生命周期
 //如果Android Studio抱怨“this”不是一个生命周期所有者
 //尝试重新构建项目或更新appcompat依赖项
 //版本1.1.0或更高。
 CameraX.bindToLifecycle((LifecycleOwner) this, imageCapture, imageAnalysis, preview);

3、代码示例

CameraXApp 示例

官方 CameraX 示例

发布了45 篇原创文章 · 获赞 24 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/zhijiandedaima/article/details/93202045