带有camera2库的Android应用程序在SDK19启动时崩溃 [英] Android application with camera2 library crash on start for SDK19

查看:323
本文介绍了带有camera2库的Android应用程序在SDK19启动时崩溃的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我在应用程序中使用了androidx.camera.camera2库.此库适用于SDK 21及更高版本.但我希望允许用户在没有camera2支持的情况下启动SDK 19的应用程序.我在代码中检查了SDK版本,但应用程序启动时崩溃.我可以从旧SDK的依赖项中排除camera2吗?

I use androidx.camera.camera2 library in my application. This library for SDK 21 and greater. But i want allow users start application for SDK 19 without camera2 support. I check SDK version in my code, but application crash on start. Can i exclude camera2 from dependencies for old SDK?

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的内容提供程序代码.

I recently stumbled into the same issue. Diving deep into the CameraX code I found that CameraX is initialized in app startup through a content provider. Here is the content provider code where CameraX is being initialized.

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;
    }
}

我对内容提供者不是很熟悉,但是我的第一个教导是,这是在清单级别添加的吗?确实我是对的. 看着那里的清单我发现了

Im not very familiar with content providers but my first taught was, this is add at the manifest level? And indeed I was right. Looking at there manifest I found this

<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>

清单已合并到我们的清单中,清单中将包含该内容提供程序,而另一方面,该内容提供程序会初始化CameraX,我们希望避免这种情况.因此,一种可行的方法是创建我们自己的空内容提供程序,并将其添加到具有相同名称的清单中.这将覆盖那里的内容提供者. 你可以看看 https://developer.android.com/studio/build/manifest-merge 有关清单合并的更多详细信息.

There manifest gets merged into ours which will include this content provider which in the other hand initializes CameraX, we want to avoid this. So one possible way of doing so is creating our own empty content provider and adding it to our manifest with the same name. This will override there content provider. You can look into https://developer.android.com/studio/build/manifest-merge for more detail about manifest merging.

所以现在有了内容提供者被覆盖的希望,您可以致电 CameraX.init(getContext(),Camera2AppConfig.create(getContext())); 仅在调用该功能时才启动,而不是在应用启动时.

So now with there content provider overriden hopefully you can call CameraX.init(getContext(), Camera2AppConfig.create(getContext())); only when the feature gets called and not on app startup.

我希望此问题在以后的版本中得到解决,并允许我们在需要时初始化cameraX.

Im hoping this gets fixed in later versions and allows us to initialize cameraX when we want to.

这篇关于带有camera2库的Android应用程序在SDK19启动时崩溃的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆