unresolved support provider_paths not granturipermission geturiforfile found fileprovider context content authorities android filepath illegalargumentexception android-fileprovider

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(); }