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). Я просто не могу понять, что вызывает ошибку, потому что все, кажется, подходит. Заранее спасибо.


person Hummus    schedule 08.12.2013    source источник
comment
не могли бы вы предоставить полный вывод logcat?   -  person bbuecherl    schedule 08.12.2013
comment
Это полный лог-код: pastebin.com/xbyMewHc   -  person Hummus    schedule 08.12.2013


Ответы (4)


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

Насколько я знаю, это не даст вам каталог с именем SpCars_album/.

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

Предоставленный вами файл не может быть обслужен FileProvider из определенных вами корней.


ОБНОВЛЕНИЕ

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

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

person CommonsWare    schedule 08.12.2013
comment
Затем предположим, что файлы, которые я хотел бы обслуживать, находятся по следующему пути: '/storage/emulated/0/Android/data/com.example.mysecondapp/files/Pictures/SpCars_Album/' Что я должен указать в моем XML-файле путей к файлам ? - person Hummus; 08.12.2013

Это старый вопрос, но у меня только что была похожая проблема.

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

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

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

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

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

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

person eAi    schedule 10.12.2015
comment
@eAj: сработало как по маслу - долговая расписка на пиво - person Chepech; 31.08.2016
comment
Подождите секунду, пользователь явно хочет использовать getExternalFilesDirs, а НЕ getExternalStorageDirectory. Так почему мы должны указывать <external-path> вместо <files-path>? - person IgorGanapolsky; 08.09.2016
comment
@IgorGanapolsky причина <files-path> обслуживает внутреннюю память files каталог /data/data/BUNDLE/files не внешнее хранилище - person xAqweRx; 02.10.2016

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

person TA2018    schedule 10.12.2018

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

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