android - support - IllegalArgumentException: no se pudo encontrar la raíz de configuración que contiene xxx en FileProvider.getUriForFile
fileprovider geturiforfile illegalargumentexception (4)
La ruta de ese archivo comienza exactamente con lo que devuelve getExternalFilesDir (Environment.DIRECTORY_PICTURES).
AFAIK, eso no te dará un directorio llamado SpCars_album/
.
Simplemente no puedo entender lo que provoca el error porque todo parece encajar.
El archivo que proporcionó no es el que puede proporcionar el FileProvider
desde sus raíces definidas.
ACTUALIZAR
Olvidé que esto está vinculado a un error de documentación en FileProvider
. FileProvider
y <external-path>
NO sirven archivos de getExternalFilesDir()
, sino de Environment.getExternalStorageDirectory()
. StreamProvider
una subclase StreamProvider
que ofrece soporte para getExternalFilesDir()
.
Si usa mi StreamProvider
, reemplazando su <external-path>
con <external-files-path name="myexternalimages" path="Pictures/SpCars_album/" />
, debería tener mejor suerte.
He estado intentando seguir el tutorial de Android sobre cómo compartir archivos. Configuré el FileProvider
esta manera:
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 probando 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]);
}
El requestFile se crea una instancia con una ruta de trabajo adecuada para un archivo. La ruta de ese archivo comienza exactamente con lo que getExternalFilesDir(Environment.DIRECTORY_PICTURES)
. Simplemente no puedo entender lo que provoca el error porque todo parece encajar. Gracias por adelantado.
Agregar la implementation ''com.android.support:support-v4:28.0.0''
en las dependencias de aplicaciones de Gradlle funcionó en mi caso. Cambie la versión de la plataforma SDK (28.0.0 en mi caso) en consecuencia.
Esta es una vieja pregunta ahora, pero acabo de tener un problema similar.
Una solución perezosa que encontré es simplemente usar:
<external-path name="myexternalimages" path="Android/" />
Debido a que getExternalStorageDirectory devuelve "/ storage / emulated / 0 /", compartir / Android (el siguiente nivel hacia abajo) permitirá el acceso a cualquier archivo que esté en su aplicación.
Alternativamente, si quieres ser más preciso, puedes hacer esto:
<external-path name="myexternalimages" path="Android/data/YOUR_BUNDLE_ID/files/SpCars_album" />
¡Esto no se siente del todo bien, pero parece funcionar!
Si no intenta capturar la excepción como IllegalArgumentException para FileProvider.getUriFoFile (), cuando ejecute su código, también tendrá esta excepción.
try {
Uri uriForFile = FileProvider.getUriForFile(this,"com.fengfutong.bluetoothc2s.fileprovider", f);
} catch (IllegalArgumentException e) {
e.printStackTrace();
}