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

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

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

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

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

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


ОБНОВИТЬ

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

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

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

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

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

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

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

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

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

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

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