IllegalArgumentException: Не удалось найти корень конфигурации, содержащий xxx на FileProvider.getUriForFile

Я пытаюсь выполнить учебник Android о совместном использовании файлов. Я установил FileProvider следующим образом:

В главном манифесте xml:

<provider
            android:name="android.support.v4.content.FileProvider"
            android:authorities="com.example.mysecondapp.fileprovider"
            android:exported="false"
            android:grantUriPermissions="true" >
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/filepaths" />
        </provider>

файл res/xml/filpaths.xml:

<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="myexternalimages" path="SpCars_album/" />
</paths>

И в моем коде я пытаюсь сделать следующее:

File requestFile = new File(mImageFilenames[position]);
                try {
                    fileUri = FileProvider.getUriForFile(
                            SeventhActivity.this,
                            "com.example.mysecondapp.fileprovider",
                            requestFile);
                } catch (IllegalArgumentException e) {
                    Log.e("File Selector",
                            "The selected file can't be shared: " +
                                    mImageFilenames[position]);
                }

RequestFile создается с соответствующим рабочим путем для файла. Путь к этому файлу начинается с того, что возвращает getExternalFilesDir(Environment.DIRECTORY_PICTURES). Я просто не могу понять, что вызывает ошибку, потому что все, кажется, подходит. Спасибо заранее.

Ответ 1

Путь к этому файлу начинается именно с того, что возвращает getExternalFilesDir (Environment.DIRECTORY_PICTURES).

AFAIK, который не даст вам каталог с именем SpCars_album/.

Я просто не могу понять, что вызывает ошибку, потому что все кажется подходящим.

Файл, который вы предоставили, не тот, который может быть отправлен FileProvider из ваших определенных корней.


UPDATE

Я забыл, что это связано с ошибкой документации на FileProvider. FileProvider и <external-path> выполняет НЕ подавать файлы с getExternalFilesDir(), но вместо этого Environment.getExternalStorageDirectory(). Я создал подкласс a StreamProvider, который предлагает поддержку getExternalFilesDir().

Если вы используете мой StreamProvider, заменив <external-path> на <external-files-path name="myexternalimages" path="Pictures/SpCars_album/" />, вам лучше повезет.

Ответ 2

Это старый вопрос, но у меня была аналогичная проблема.

ленивое решение, которое я нашел, это просто использовать:

<external-path name="myexternalimages" path="Android/" />

Поскольку getExternalStorageDirectory возвращает "/storage/emulated/0/", общий доступ /Android (следующий уровень вниз) позволит получить доступ к любым файлам, находящимся в вашем приложении.

В качестве альтернативы, если вы хотите быть более точным, вы можете сделать это:

<external-path name="myexternalimages" path="Android/data/YOUR_BUNDLE_ID/files/SpCars_album" />

Это не совсем правильно, но похоже, что это работает!

Ответ 3

Добавление implementation 'com.android.support:support-v4:28.0.0' к зависимостям gradlle приложения работало в моем случае. Пожалуйста, измените версию платформы SDK (28.0.0 в моем случае) соответственно.

Ответ 4

если вы не пытаетесь исключить catch как IllegalArgumentException для FileProvider.getUriFoFile(), при запуске вашего кода вы также получите это исключение.

try {
     Uri uriForFile = FileProvider.getUriForFile(this,"com.fengfutong.bluetoothc2s.fileprovider", f);
} catch (IllegalArgumentException e) {
     e.printStackTrace();
}