Fileprovider всегда бросает IAE

Я просмотрел все ответы на StackOverflow, и для меня нет ответа.

Та же ошибка для реального устройства и эмуляторов.

Fileprovider всегда выдает исключение IllegalArgumentException

Есть манифест

<application
   ...

    <provider
        android:name = "android.support.v4.content.FileProvider"
        android:grantUriPermissions = "true"
        android:exported = "false"
        android:authorities = "${applicationId}">
        <meta-data
            android:name = "android.support.FILE_PROVIDER_PATHS"
            android:resource = "@xml/filepath"/>
    </provider>

</application>

Есть файл path.xml

<paths>
<files-path
    name = "logs"
    path = "logs/" /></paths>

И есть код, который всегда выдает исключение

        final Intent emailIntent = new Intent(Intent.ACTION_SEND);
        emailIntent.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

        File file = new File(logger.getFileName());
        Uri uri = null;
        try {
            uri = FileProvider.getUriForFile(getContext(), BuildConfig.APPLICATION_ID, file);
        } catch (IllegalArgumentException e) {
            e.printStackTrace();
        }

logger.getFileName() - возвращает реальное имя файла, например: "logs_22032019.txt"

Что я уже пробовал: Изменения в манифесте, такие как: android:authorities="com.realname.of.package" Изменения в файле path.xml

name = "logs"
  • 1) то же имя файла 2) просто /

    путь = "журналы/"

  • 1) . 2) / 3) полный путь 4) файлы 5) /файлы 6) файлы/ например

Что я заметил - там действительно путь к файлам:

/data/user/0/com.app.realname/files/log.txt

Но FileProvider в нем идет к:

"log.txt" -> "/data/data/com.app.realname/files/log.txt"-->

ПРИМЕЧАНИЕ: Мне нужна только ВНУТРЕННЯЯ память.

0
0
24
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

logger.getFileName() - returns real file name for example: "logs_22032019.txt"

Это неверный путь к файловой системе. Это допустимое имя файла, но оно не говорит, где этот файл должен находиться на устройстве.

Это ваша конфигурация FileProvider:

<files-path
    name = "logs"
    path = "logs/" />

Для этого подойдет File:

File file = new File(getFilesDir(), "logs/"+logger.getFileName());

there is really the path of files... But FileProvider in it goes to

Это одно и то же расположение файловой системы для пользователя основного устройства.

Другие вопросы по теме