Ошибка слияния 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>