Ошибка слияния AndroidManifest с помощью FileProvider
Я пытаюсь использовать библиотеку, которая имеет это в своем AndroidManifest.xml:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.imagepicker.provider"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/provider_paths"/>
</provider>
У меня тот же тег в моем приложении AndroidManifest.xml:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="@string/FileProviderAuthority"
android:exported="false"
android:grantUriPermissions="true">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"></meta-data>
</provider>
Таким образом, он явно дает ошибку слияния манифеста:
Error:Execution failed for task ':app:processDebugManifest'.
> Manifest merger failed with multiple errors, see logs
Что предлагает "добавить" инструменты: replace = "android: полномочия" на элемент в AndroidManifest.xml для переопределения ".
Итак, я добавляю tools:replace="android:authorities"
, как это, в мое приложение AndroidManifest.xml:
<application
tools:replace="android:authorities"
android:name=".appcontroller.AppController"
android:allowBackup="true"
android:hardwareAccelerated="true"
android:icon="@mipmap/ic_launcher"
android:label="@string/app_name"
android:largeHeap="true"
android:supportsRtl="true"
android:theme="@style/AppTheme">
И затем я получаю эту ошибку:
Error:
tools:replace specified at line:25 for attribute android:authorities, but no new value specified
То же самое происходит с tools:replace="android.support.v4.content.FileProvider"
.
Что мне не хватает?
Ответы
Ответ 1
Для решения этой проблемы существует два варианта: либо вы меняете свой манифест для использования другого класса, чем android.support.v4.content.FileProvider
, либо создаете PR/проблему, требуя, чтобы владелец lib изменил его/ее (это был бы лучший случай сценарий).
Если вы хотите быстро исправить, просто создайте класс, который расширяет FileProvider
, например:
import android.support.v4.content.FileProvider;
public class MyFileProvider extends FileProvider {
}
и в вашем файле манифеста вы измените его на:
<provider android:name=".MyFileProvider" ... >
Ответ 2
Добавьте в свой файл AndroidManifest.xml
внутри тега application
:
<provider
android:name="android.support.v4.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true"
tools:replace="android:authorities">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"
tools:replace="android:resource" />
</provider>
Ответ 3
Поскольку вы не меняете ни одного из значений в провайдере, вам не нужно включать его в манифест. Просто удалите эти строки.
Ответ 4
Для тех, кто использует SDK 28 и выше, если вы переходите на AndroidX, решение:
<provider
android:name="androidx.core.content.FileProvider"
android:authorities="${applicationId}.fileprovider"
android:exported="false"
android:grantUriPermissions="true"
tools:replace="android:authorities">
<meta-data
android:name="android.support.FILE_PROVIDER_PATHS"
android:resource="@xml/file_paths"/>
</provider>