Android: FileProvider IllegalArgumentException Не удалось найти настроенный корень, который содержит /data/data/**/files/Videos/final.mp4

Я пытаюсь использовать FileProvider для воспроизведения видео с частного пути.

java.lang.IllegalArgumentException: Failed to find configured root that contains /data/data/XXXXX(Package)/files/Videos/final.mp4

Код:

<paths>
    <files-path path="my_docs" name="Videos/" />
</paths>

Java-код:

File imagePath = new File(getFilesDir(), "Videos");
File newFile = new File(imagePath, "final.mp4");
Log.d(TAG, "-------------newFile:"+newFile.exists());//True here
//Exception in below line
Uri contentUri = FileProvider.getUriForFile(this,"com.wow.fileprovider", newFile);

manifest.xml

<provider
    android:name="android.support.v4.content.FileProvider"
    android:authorities="com.wow.fileprovider"
    android:exported="false"
    android:grantUriPermissions="true">

<meta-data
    android:name="android.support.FILE_PROVIDER_PATHS"
    android:resource="@xml/file_paths" />

Есть какие-нибудь подсказки по этому поводу?

Спасибо ниц

2 ответа

Решение

У вас есть name и ваш path переворачивается. name это то, что идет в Uri, а также path это относительное расположение в корне файловой системы.

Идти с:

<paths>
    <files-path name="my_docs" path="Videos/" />
</paths>

Измените XML вашего провайдера на это.

<?xml version="1.0" encoding="utf-8"?>
<paths>
  <external-path name="external_files" path="." />
  <root-path name="external_files" path="/storage/" />
</paths>

У меня была та же самая основная ситуация. Я все правильно определил (путь к файлам в xml), но есть еще одна вещь, которая приводит к тому же исключению. Я добавляю другой ответ просто как дополнение, и комментарий не будет хорошо читаемым.

Я создал / прочитал каталог, где я храню файлы как:

context.getDir("Documents", Context.MODE_PRIVATE) 

Это приводит к пути, как:

/data/user/0/ch.myapp/app_Documents/6c3c70d5-af66-48ef-8dfc-f4341de4e1bd.docx

Затем я изменил создание каталога на:

File directory = new File(context.getFilesDir(), "Documents");
if (!directory.exists()) {
  directory.mkdir();
}

Это приводит к пути, как:

/data/user/0/ch.myapp/files/Documents/6c3c70d5-af66-48ef-8dfc-f4341de4e1bd.docx

Согласно документации Откройте каталог, оба метода должны быть эквивалентны, насколько я понимаю. Но это создает другой путь... Может быть, формулировка просто не ясна для меня в документации, но для меня она написана неправильно.

getDir (имя, режим)

Создает новый каталог (или открывает существующий каталог) в каталоге уникальной файловой системы вашего приложения. Этот новый каталог появляется внутри каталога, предоставленного getFilesDir().

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