一、简介
CameraX作为目前主流的且官方不断维护和推荐使用的相机实现框架,掌握其实现基本原理和最佳实践有助于帮助开发者更便捷的使用手机自带的相机能力。
该系列文章主要从初始化、预览、销毁等流程来详细阐述如何使用好CameraX框架提供的相机能力。后续的内容主要按照如下主线来进行:
- 代码框架和必要的组建模块
- CameraX初始化流程【变量、参数设置】
- CameraX预览
- CameraX销毁流程
每一块都会从三个层次来递进式阐述,分别为,流程步骤分析,源码解析,最佳实践,从而更系统的来帮助读者搭建一个完善健壮的商业化相机App。
相关文章和链接推荐:
关注我,随时获取音视频更多相关资讯。
二、模块划分
在进行App开发之前,都有必要对整个代码的框架和模块进行初步设计,如果要搭建一个比较通用的健壮的CameraX实例MVP App,基本需要考虑如下几块:
- 项目配置【camerax相关库和build.config】
- UI层面【承载预览的View,一些Button,相机设置如闪光灯、缩放、对焦、切换前后置、切换画幅等】
- 线程管理【CameraX的相关操作需要在异步线程进行】
- CameraXImpl【初始化、参数设置、预览】
- 容错和错误处理机制
- 同步和锁机制
后续,文章将会按照如上的步骤进行阐述,完成了以上6步,那么可以说基本上能搭建一个90分的CameraX App了。接下来,我们进行第一部分的介绍
三、相关配置【camerax相关库,build.config】
CameraX
是一个 Jetpack
库,目标是帮助开发者更轻松地开发相机应用。在此之前有Camera2
和Camera1
库。感兴趣的读者可自行浏览同级目录下有关Camera2
和Camera1
的文章介绍。
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个重要的问题
- 建议CameraX支持的Android minSDK为28
- 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相关最佳实践。