前语

工作是这样的,我两周前闲时写了个用cameraX实现摄像头录制视频然后进行编码的功能,可是由于某些事写到一半鸽了,可是其时是能保证功能正常的。成果两周后的今天,略微了那么一点时刻,我想上去把进展补了,成果一运转直接报错。直接给我整不会了,我榜首反应是我没改东西啊,成果细心去找问题,发现这其间,的确坑很大。

原版别的依靠

implementation "androidx.camera:camera-core:1.2.0-beta01"
implementation "androidx.camera:camera-camera2:1.2.0-alpha04"
implementation "androidx.camera:camera-lifecycle:1.2.0-alpha04"
implementation "androidx.camera:camera-video:1.2.0-beta01"
implementation "androidx.camera:camera-view:1.2.0-alpha04"

原版别的依靠是这样的,这个是其时按照官方最新的版别进行的操作。信任很多人看到alpha和beta现已开端觉得这玩意不太对劲了。

成果运转后发现报错: java.lang.NoSuchFieldError: No static field ANALYSIS of type Landroidx/camera/core/impl/SurfaceConfigConfigSize;inclassLandroidx/camera/core/impl/SurfaceConfigConfigSize; in class Landroidx/camera/core/impl/SurfaceConfigConfigSize; or its superclasses (declaration of ‘androidx.camera.core.impl.SurfaceConfig$ConfigSize’ appears in /data/app/~~VnqBDbq3S5fyh5YCiSIKAQ==/com.kylin.videoproject-AKGt8exD8YYNkrxyT5tReg==/base.apk)

Android CameraX版本大坑

能明确的看出报错的原因是ExtraSupportedSurfaceCombinationsQuirk这个类中没有找道SurfaceConfig$ConfigSize的ANALYSIS这个特点。

然后咱们跟着源码去看

Android CameraX版本大坑

发现的确没有这个参数。这是为什么呢?为什么我两周前又能正常run,现在又说短少这个特点。

androidx.camera:camera-core

细节就在这个当地,我找了ExtraSupportedSurfaceCombinationsQuirk和SurfaceConfig的ConfigSize归于哪个包,发现ExtraSupportedSurfaceCombinationsQuirk是归于androidx.camera:camera-camera,而SurfaceConfig的ConfigSize归于androidx.camera:camera-core,它们并不归于同一个模块

再进一步去看,就能从细节中发现问题的地点

Android CameraX版本大坑

能够看出我明明依靠的是core1.2.0-beta01,可是我的依靠目录中却发现还有一个core1.2.0-beta02,我想只需一个可能,那便是’androidx.appcompat:appcompat:1.2.0’的创作。

对比两个版别的源码后发现的确是这个当地的问题。

Android CameraX版本大坑

Android CameraX版本大坑

定论和问题的修正

所以定论便是appcompat中现已有camera-core了,咱们没必要再去独自依靠camera-core。我没有具体看下去,不知道它为什么只内部依靠camera-core,没有依靠camera-camera的

那是不是把implementation “androidx.camera:camera-core:1.2.0-beta01″去掉就行,当然不是,想什么呢?它都依靠core:1.2.0-beta02了,去不去掉这个依靠没有任何影响。

那怎么办呢?问题便是camera-camera2:1.2.0-alpha04和camera-core:1.2.0-beta02不匹配。那做法就很简单了,更新camera-camera2:1.2.0-alpha04到和camera-core:1.2.0-beta02版别匹配就行,所以咱们直接去官方看最新版别。

Android CameraX版本大坑

我NM,官方显现的最新版别是1.2.0-beta01,成果改之后发现没用,仍是错的,也便是说这个官方显现的最新版别仍是不匹配。并且按理来说,如果依靠有新版别的话,你的Gradle里面会给这个依靠套一层黄色,成果camera-camera改成1.2.0-beta01之后,并没有提示有新版别。

那怎么办,appcompat里面的必定是不好改了,可是也能够,我也有个思路,依靠appcompat的时候把camera-core给exclude掉(没试过啊,不知道会不会出问题)

当然还有一种方法,没错便是赌,我直接把camera-camera的版别改成1.2.0-beta02赌一把

那有的人可能会问,赌失利了怎么办,那赌失利了再考虑其它计划嘛,可惜很幸运的是赌成功了,终究的依靠是这样:

implementation "androidx.camera:camera-camera2:1.2.0-beta02"
implementation "androidx.camera:camera-lifecycle:1.2.0-beta02"
implementation "androidx.camera:camera-video:1.2.0-beta02"
implementation "androidx.camera:camera-view:1.2.0-beta02"

总结

这倒不是一个很难的问题,说不定过几天官方就显现最新的版别变成camera-camera2:1.2.0-beta02,那就不会再有这个问题。

但我信任这类问题必定仍是会有相似的,特别是这种alpha和beta的版别,一看就觉得可能会有坑。关键的思路是两个不同的模块之前的版别不同步的情况下,要以怎样的一个思路去处理问题。比如降版别,这里把appcompat的版别从1.2.0往下降行不行,我觉得应该可行。或许以其它的方法去处理这样的一个问题,我认为都是能够的,方法总比困难多。