IllegalArgumentException: Error al encontrar la raíz de configuración que contiene xxx en FileProvider.getUriForFile

He estado intentando seguir el tutorial de Android para compartir archivos. He configurado el FileProvider como este:

En el manifiesto principal 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> 

El archivo res / xml / filpaths.xml:

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

Y en mi código estoy intentando lo siguiente:

 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 se instancia con una ruta de trabajo adecuada para un archivo. La ruta de ese archivo comienza exactamente con lo que getExternalFilesDir(Environment.DIRECTORY_PICTURES) devuelve. Simplemente no puedo entender lo que plantea el error, porque todo parece encajar. Gracias por adelantado.

La ruta de ese archivo comienza exactamente con lo que getExternalFilesDir (Environment.DIRECTORY_PICTURES) devuelve.

AFAIK, que no le dará un directorio llamado SpCars_album/ .

Simplemente no puedo entender lo que plantea el error, porque todo parece encajar.

El archivo que ha proporcionado no es uno que puede ser servido por el FileProvider de sus raíces definidas.


ACTUALIZAR

Olvidé que esto está ligado a un error de documentación en FileProvider . FileProvider y <external-path> NO sirven archivos de getExternalFilesDir() , sino de Environment.getExternalStorageDirectory() . He creado una subclase StreamProvider que ofrece soporte para getExternalFilesDir() .

Si utilizas mi StreamProvider , reemplazando tu <external-path> por <external-files-path name="myexternalimages" path="Pictures/SpCars_album/" /> , tendrás mejor suerte.

Esta es una vieja pregunta ahora, pero acabo de tener un problema similar.

Una solución perezosa que encontré es sólo para usar:

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

Debido a que getExternalStorageDirectory devuelve "/ storage / emulated / 0 /", compartir / Android (el siguiente nivel abajo) permitirá que se acceda a cualquier archivo que se encuentre en su aplicación.

Alternativamente, si desea ser más preciso, puede hacer esto:

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

Esto no se siente muy bien, pero parece que funciona!

Si no intenta capturar excepción como IllegalArgumentException para FileProvider.getUriFoFile (), al ejecutar el código, también tendrá esta excepción.

 try { Uri uriForFile = FileProvider.getUriForFile(this,"com.fengfutong.bluetoothc2s.fileprovider", f); } catch (IllegalArgumentException e) { e.printStackTrace(); } 
  • FileProvider no funciona con la cámara
  • FileProvider produce excepción en GetUriForFile
  • Error de FileProvider en los dispositivos Huawei
  • EXCEPCIÓN FATAL: ThumbnailManager-1 mientras comparte imágenes con Intent
  • SecurityException con grantUriPermission al compartir un archivo con FileProvider
  • Android FileProvider para ext sdcard
  • Compartir imágenes almacenadas en caché utilizando FileProvider
  • Compartir fotos con Android con FileProvider
  • Selección de un archivo de imagen de la Galería mediante FileProvider
  • Cómo abrir un archivo APK para todas las versiones de Android
  • Error al encontrar la raíz configurada que contiene
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.