Приложение Android с вылетом библиотеки camera2 при запуске для SDK19 - PullRequest
0 голосов
/ 30 мая 2019

Я использую библиотеку androidx.camera.camera2 в своем приложении.Эта библиотека для SDK 21 и выше.Но я хочу разрешить пользователям запускать приложение для SDK 19 без поддержки camera2.Я проверяю версию SDK в своем коде, но сбой приложения при запуске.Могу ли я исключить camera2 из зависимостей для старого 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)

1 Ответ

1 голос
/ 31 мая 2019

Я недавно наткнулся на ту же проблему.Погружаясь вглубь кода 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, когда мы захотим.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...