Манифест с файловым провайдером, совместимым со старой версией Android
Чтобы поддерживать совместимость с Android 8 для моего приложения, я должен был добавить тег "провайдера" в манифест. Это тег:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="xxx.xxx.fileprovider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>
Я все реализовал, и все работает на Android 7/8/9.
Сегодня попробуйте установить приложение на старое устройство (ANDROID 4), и это сообщение об ошибке:
java.lang.RuntimeException: **Unable to get provider android.support.v4.content.FileProvider**:
java.lang.ClassNotFoundException: Didn't find class "**android.support.v4.content.FileProvider**" on path:
DexPathList[[zip file "/data/app/mywork.activity-4.apk"],nativeLibraryDirectories=[/data/app-lib/mywork.activity-4, /vendor/lib, /system/lib]]
Я понял, что проблема связана с тем, что на Android4 нет этой библиотеки, но я не хочу, чтобы две версии приложения абсолютно имели два разных файла манифеста.
Какие могут быть решения? Можете ли вы добавить библиотеку (которой нет у andorid4) вручную? Это противоречит чему-то?
Иначе я не понимаю смысла ввода кода
(Build.VERSION.SDK_INT> = Build.VERSION_CODES.N
)
когда я решу, использовать ли fileprovider или старый тип намерения.
Если у меня есть манифест, который не совместим с версиями до Build.VERSION_CODES.N.... условное утверждение в коде не имеет смысла.
Как я мог решить?
1 ответ
Более вероятный targetApi
должно сработать:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="xxx.xxx.fileprovider"
android:grantUriPermissions="true"
android:exported="false"
tools:targetApi="o">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths" />
</provider>