带有 camera2 库的 Android 应用程序在 SDK19 启动时崩溃

标签 android sdk android-camera2

我在我的应用程序中使用了 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/

相关文章:

Android 包名称不是有效的包名称

android - 即使在 onHandleIntent 完成后 IntentService 仍在后台运行

android - 我不知道我的 SDK 和 ADT 插件到底出了什么问题

Android Camera2 API JPEG_QUALITY 不可用

android - 使用 camera2api 捕获多张图像使预览在拍照时暂停片刻

android - Android 中的 GCM 消息数

java - FFmpeg 链接器错误 : Error due to text relocations in libavcodec shared object

ios - 为什么 Xcode 4 没有运行我的最新版本?

java - 无法启动 UI Automator 查看器

opencv - Camera2 API中ImageReader中的图像流