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:
- Android - proveedor de archivos - permiso de denegación
- Compartir imágenes desde el almacenamiento interno mediante FileProvider
- Implementación de un selector de archivos en Android y copia del archivo seleccionado en otra ubicación
- Android: FileProvider IllegalArgumentException Error al encontrar la raíz configurada que contiene /data/data/**/files/Videos/final.mp4
- Uso del URI de contenido con ACTION_VIDEO_CAPTURE
<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.
- Error de FileProvider
- PackageManager # installPackage no funciona para Android N
- ¿Cómo utilizar el soporte FileProvider para compartir contenido con otras aplicaciones?
- FileProvider y almacenamiento externo secundario
- Android: FileProvider en una carpeta de almacenamiento externo personalizada
- Fotos de Google+ ACTION_VIEW, FLAG_GRANT_PERSISTABLE_URI_PERMISSION Excepción
- ¿Cómo compartir archivos desde cualquier ruta usando un FileProvider?
- La intención de compartir imágenes funciona para Gmail pero bloquea FB y twitter
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(); }
- Por qué Images.Media.insertImage devuelve null
- Cómo crear un objeto retrofit.Response durante las pruebas de unidad con Retrofit 2