act*_*tin 2 sdk android 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)
小智 7
我最近偶然发现了同样的问题。深入研究 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;
    }
}
我对内容提供者不是很熟悉,但我第一次教的是,这是在清单级别添加的?确实我是对的。看着那里的清单,我发现了这个
<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 以了解有关清单合并的更多详细信息。
所以现在有内容提供者覆盖希望你可以调用 CameraX.init(getContext(), Camera2AppConfig.create(getContext())); 仅当该功能被调用而不是在应用程序启动时。
我希望这在以后的版本中得到修复,并允许我们在需要时初始化 cameraX。
| 归档时间: | 
 | 
| 查看次数: | 1112 次 | 
| 最近记录: |