Android 带有 camera2 库的应用程序在 SDK19 启动时崩溃
Android application with camera2 library crash on start for SDK19
我在我的应用程序中使用 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.access00(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;
}
}
我对内容提供者不是很熟悉,但我的第一个教训是,这是在清单级别添加的吗?事实上我是对的。
查看那里的清单我发现了这个
<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。
我在我的应用程序中使用 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.access00(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;
}
}
我对内容提供者不是很熟悉,但我的第一个教训是,这是在清单级别添加的吗?事实上我是对的。 查看那里的清单我发现了这个
<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。