我在我的应用程序中使用了 androidx.camera.camera2 库。此库适用于 SDK 21 及更高版本。但我希望允许用户在不支持 camera2 的情况下启动 SDK 19 的应用程序。我在我的代码中检查了 SDK 版本,但应用程序在启动时崩溃了。我可以从旧 SDK 的依赖项中排除 camera2 吗?
05-30 12:13:42.318 2000-2000/com.myapp.android E/AndroidRuntime: FATAL EXCEPTION: main
Process: com.myapp.android, PID: 2000
java.lang.NoClassDefFoundError: android.util.Size
at androidx.camera.camera2.impl.Camera2DeviceSurfaceManager.<clinit>(Camera2DeviceSurfaceManager.java:53)
at androidx.camera.camera2.Camera2AppConfig.create(Camera2AppConfig.java:58)
at androidx.camera.camera2.impl.Camera2Initializer.onCreate(Camera2Initializer.java:44)
at android.content.ContentProvider.attachInfo(ContentProvider.java:1591)
at android.content.ContentProvider.attachInfo(ContentProvider.java:1562)
at android.app.ActivityThread.installProvider(ActivityThread.java:4790)
at android.app.ActivityThread.installContentProviders(ActivityThread.java:4385)
at android.app.ActivityThread.handleBindApplication(ActivityThread.java:4325)
at android.app.ActivityThread.access$1500(ActivityThread.java:135)
at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1256)
at android.os.Handler.dispatchMessage(Handler.java:102)
at android.os.Looper.loop(Looper.java:136)
at android.app.ActivityThread.main(ActivityThread.java:5017)
at java.lang.reflect.Method.invokeNative(Native Method)
at java.lang.reflect.Method.invoke(Method.java:515)
at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:779)
at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:595)
at dalvik.system.NativeStart.main(Native Method)
最佳答案
我最近偶然发现了同样的问题。 深入研究 CameraX 代码,我发现 CameraX 是通过内容提供程序在应用程序启动时初始化的。这是初始化 CameraX 的内容提供程序代码。
public final class Camera2Initializer extends ContentProvider {
private static final String TAG = "Camera2Initializer";
@Override
public boolean onCreate() {
Log.d(TAG, "CameraX initializing with Camera2 ...");
CameraX.init(getContext(), Camera2AppConfig.create(getContext()));
return false;
}
}
我对内容提供者不是很熟悉,但我的第一个教训是,这是在 list 级别添加的吗?事实上我是对的。 看着 list 我发现了这个
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
package="androidx.camera.camera2">
<application>
<provider
android:name=".Camera2Initializer"
android:authorities="${applicationId}.camerax-init"
android:exported="false"
android:initOrder="100"
android:multiprocess="true" />
</application>
</manifest>
list 被合并到我们的 list 中,其中将包含此内容提供者,另一方面初始化 CameraX,我们希望避免这种情况。因此,一种可能的方法是创建我们自己的空内容提供者并将其添加到我们的同名 list 中。这将覆盖那里的内容提供者。 你可以看看 https://developer.android.com/studio/build/manifest-merge 有关 list 合并的更多详细信息。
所以现在内容提供者被覆盖了,希望你可以调用 CameraX.init(getContext(), Camera2AppConfig.create(getContext())); 仅在调用该功能时而不是在应用程序启动时。
我希望这个问题在以后的版本中得到修复,并允许我们在需要时初始化 cameraX。
关于带有 camera2 库的 Android 应用程序在 SDK19 启动时崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56374939/