8月更文挑战|Android基础开发-CameraX开箱即用

1,773 阅读2分钟

这是我参与8月更文挑战的第1天,活动详情查看:8月更文挑战

CameraX

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

学习Android开发同学都知道相机API从原先Camera到Camera2再到现在的CameraX过程中经历了许多变化。在最开始使用Camera的时候API过于简单,支持功能并不多;在到Camera2,支持相机功能有所增加但发现API调用过程过于繁琐学习成本高。所以CameraX就由此产出以便于开发者更好得实现相机功能。虽然CameraX是新框架但依旧是基于Camera2,在其基础之上具备生命周期感知以及进行上层良好封装并提高设备兼容性问题。

PS:当前版本CameraX组件目前已经是Release版本1.0.1、camera-view为1.0.0-alpha27

    def camerax_version = "1.0.1"
    // CameraX core library using camera2 implementation
    implementation "androidx.camera:camera-camera2:$camerax_version"
    // CameraX Lifecycle Library
    implementation "androidx.camera:camera-lifecycle:$camerax_version"
    // CameraX View class
    implementation "androidx.camera:camera-view:1.0.0-alpha27"

傻瓜式接入

CameraX提供了高级封装类LifecycleCameraController来简化相机开发,开发者只需要实例化两个对象:PreviewView和LifecycleCameraController就能实现相机功能。

    Executor executor = Executors.newSingleThreadExecutor();
    // 相机预览视图
    PreviewView previewView = new PreviewView(context);
    // 绑定生命周期的相机控制器
    LifecycleCameraController cameraControl = new LifecycleCameraController(context);
    cameraControl.bindToLifecycle(lifecycleOwner);
    cameraControl.getInitializationFuture().addListener(new Runnable() {
            @Override
            public void run() {
                previewView.setController(cameraControl);
            }
        }, ContextCompat.getMainExecutor(context));
    }
    cameraControl.takePicture() // 拍照
    cameraControl.startRecording() // 录制
    cameraControl.setCameraSelector() //切换摄像头
    cameraControl.enableTorch() // 切换闪光灯
    cameraControl.setEnabledUseCases()

LifecycleCameraController封装实现了相机基础功能:摄像头切换、拍照、录像、闪光灯、视图对焦、视图缩放等,对于开发者来说使用相机API门槛和成本大大降低,因此CameraX真正做到了开箱即用。

CameraX的录制模式和拍照模式是独立的,因此在拍照是需要将重新设置CameraController的useCase。录制模式设置为CameraController.VIDEO_CAPTURE,拍照模式设置为CameraController.IMAGE_ANALYSIS | CameraController.IMAGE_CAPTURE。

总结

或许对于CameraX以LifecycleCameraController接入方式是比较快捷方便的,但同时功能也是封闭内聚的,导致开发者只能执行内部提供的功能性API,无法开发一些配置和设置更多的定制化需求。例如添加图片滤镜、特效等具有个性化功能,那么LifecycleCameraController接入方式就不再适用。

其实CameraX也提供自定义接入形式,通过阅读LifecycleCameraController源码可知一二。