【Android CameraX】CameraX初始化、预览、销毁源码分析和最佳实践 (一) —— 介绍和CameraX相关配置

一、简介

CameraX作为目前主流的且官方不断维护和推荐使用的相机实现框架,掌握其实现基本原理最佳实践有助于帮助开发者更便捷的使用手机自带的相机能力。

该系列文章主要从初始化、预览、销毁等流程来详细阐述如何使用好CameraX框架提供的相机能力。后续的内容主要按照如下主线来进行:

  1. 代码框架和必要的组建模块
  2. CameraX初始化流程【变量、参数设置】
  3. CameraX预览
  4. CameraX销毁流程

每一块都会从三个层次来递进式阐述,分别为,流程步骤分析,源码解析,最佳实践,从而更系统的来帮助读者搭建一个完善健壮的商业化相机App。

相关文章和链接推荐:

  1. 【文章】Android Camera系列文章目录索引汇总
  2. 【文章】Android CameraX 综述
  3. 【文章】CameraXBasic —— 官方CameraX实例源码分析
  4. 【文章】Camera1初始化销毁流程(一) —— 官方Demo初始化流程分析
  5. 【链接】官方Demo传送门
  6. 【链接】CameraX库发版记录

关注我,随时获取音视频更多相关资讯。

二、模块划分

在进行App开发之前,都有必要对整个代码的框架和模块进行初步设计,如果要搭建一个比较通用的健壮的CameraX实例MVP App,基本需要考虑如下几块:

  1. 项目配置【camerax相关库和build.config】
  2. UI层面【承载预览的View,一些Button,相机设置如闪光灯、缩放、对焦、切换前后置、切换画幅等】
  3. 线程管理【CameraX的相关操作需要在异步线程进行】
  4. CameraXImpl【初始化、参数设置、预览】
  5. 容错和错误处理机制
  6. 同步和锁机制

后续,文章将会按照如上的步骤进行阐述,完成了以上6步,那么可以说基本上能搭建一个90分的CameraX App了。接下来,我们进行第一部分的介绍

三、相关配置【camerax相关库,build.config】

CameraX是一个 Jetpack 库,目标是帮助开发者更轻松地开发相机应用。在此之前有Camera2Camera1库。感兴趣的读者可自行浏览同级目录下有关Camera2Camera1的文章介绍。

CameraX的第一个版本发布在2019年5月7日。我们可以看到Android9.0的发布时间在2018年8月。因此在Android9.0(API 级别 28),包括9.0以前的版本所使用的相机框架还是为Camera2或者Camera1。即使目前CameraX最新的版本为2022 年 9 月 21 日。 并且官方声称CameraX向后兼容 Android 5.0(API 级别 21)。考虑到Android的开源特性,以及大大小小厂商手机兼容性问题,这里还是建议在Android9.0(API 级别 28)以上使用CameraX框架,Android9.0以下使用Camera1或者Camera2

确定了支持的Android SDK,下一件就是确定需要引用的CameraX库,CameraX库发版记录

说明
camera-camera2必选核心库
camera-core必选核心库
camera-extensions可选,扩展功能
camera-lifecycle可选,生命周期管理库
camera-mlkit-vision可选,相机与AI能力结合库
camera-video可选,录制视频库

最新时间:2022 年 9 月 21 日 ;最新版本号:1.2.0-beta02

重点小结:
本小节,我们确定了2个重要的问题

  1. 建议CameraX支持的Android minSDK为28
  2. CameraX最新时间:2022 年 9 月 21 日 ;最新版本号:1.2.0-beta02

其他的build.config和相关支持库和CameraX关联不大,自己可参考第四节具体配置代码,按需引用即可。

四、build.gradle配置代码参考

4.1 官方:Project -> build.gradle

buildscript {
    // Top-level variables used for versioning
    ext.kotlin_version = '1.5.21'
    ext.java_version = JavaVersion.VERSION_1_8

    repositories {
        google()
        mavenCentral()
    }
    dependencies {
        classpath 'com.android.tools.build:gradle:4.2.2'
        classpath "org.jetbrains.kotlin:kotlin-gradle-plugin:$kotlin_version"
        classpath "androidx.navigation:navigation-safe-args-gradle-plugin:2.3.5"

        // NOTE: Do not place your application dependencies here; they belong
        // in the individual module build.gradle files
    }
}

allprojects {
    repositories {
        google()
        mavenCentral()
    }
}

task clean(type: Delete) {
    delete rootProject.buildDir
}

4.2 官方:App -> build.gradle

apply plugin: 'com.android.application'
apply plugin: 'kotlin-android'
apply plugin: 'kotlin-kapt'
apply plugin: "androidx.navigation.safeargs"

android {
    compileSdkVersion 30
    defaultConfig {
		...
        minSdkVersion 21
        targetSdkVersion 30
    }

    compileOptions {
        sourceCompatibility rootProject.ext.java_version
        targetCompatibility rootProject.ext.java_version
    }

    kotlinOptions {
        jvmTarget = rootProject.ext.java_version
    }

...
}

dependencies {
    // Kotlin lang
    implementation 'androidx.core:core-ktx:1.6.0'
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"
    implementation 'org.jetbrains.kotlinx:kotlinx-coroutines-android:1.5.0'
    // CameraX core library
    def camerax_version = '1.1.0-alpha07'
    implementation "androidx.camera:camera-core:$camerax_version"

    // CameraX Camera2 extensions
    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 Extensions library
    // implementation 'androidx.camera:camera-extensions:1.0.0-alpha27'
    ...
}

本人目前使用的配置如下:

minSdkVersion =  28 //【如果为21,则代码里进行判断9.0才使用CameraX】
kotlin_version = '1.6.10'
camera_lib_version = '1.2.0-beta02'

关注我,获取更多CameraX相关最佳实践。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Camerax是Android相机框架的一部分,它提供了便捷的API来实现相机预览和拍照功能。 要使用Camerax进行预览拍照,我们首先需要配置相机权限。在AndroidManifest.xml文件中,添加以下权限: ``` <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> ``` 接下来,在activity的布局文件中添加一个预览用的TextureView: ``` <TextureView android:id="@+id/previewView" android:layout_width="match_parent" android:layout_height="match_parent" /> ``` 在相关的Activity中,我们使用Camerax来实现预览和拍照功能。首先,在onCreate方法中初始化Camerax的实例: ``` PreviewConfig previewConfig = new PreviewConfig.Builder().build(); Preview preview = new Preview(previewConfig); ImageCaptureConfig captureConfig = new ImageCaptureConfig.Builder().build(); ImageCapture imageCapture = new ImageCapture(captureConfig); CameraX.bindToLifecycle(this, preview, imageCapture); ``` 然后,我们需要将预览显示在TextureView中: ``` TextureView previewView = findViewById(R.id.previewView); preview.setSurfaceProvider(previewView.getSurfaceProvider()); ``` 最后,我们可以在需要的时候进行拍照: ``` // 通过点击按钮触发拍照 Button captureButton = findViewById(R.id.captureButton); captureButton.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { File file = new File(getExternalFilesDir(Environment.DIRECTORY_PICTURES), "IMG_" + System.currentTimeMillis() + ".jpg"); ImageCapture.OutputFileOptions outputFileOptions = new ImageCapture.OutputFileOptions.Builder(file).build(); imageCapture.takePicture(outputFileOptions, ContextCompat.getMainExecutor(MainActivity.this), new ImageCapture.OnImageSavedCallback() { @Override public void onImageSaved(@NonNull ImageCapture.OutputFileResults outputFileResults) { // 在此处对拍照后的图片进行处理 } @Override public void onError(@NonNull ImageCaptureException exception) { // 拍照出现错误时的处理 } }); } }); ``` 通过以上步骤,我们就可以使用Camerax来实现Android相机的预览和拍照功能。它提供了简单而强大的API,使得实现相机应用变得更加容易。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值