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