Android: FileProvider en una carpeta de almacenamiento externo personalizada

Estoy intentando fijar un fileprovider para compartir el archivo. Mis archivos se guardan en una carpeta "AppName" en el almacenamiento externo (el mismo nivel que las carpetas Android, Películas e Imágenes).

Aquí está mi config de proveedor de archivos:

<provider android:name="android.support.v4.content.FileProvider" android:authorities="com.mydomain.appname.fileprovider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/file_paths"/> </provider> 

Y los file_paths.xml:

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

Cuando intento acceder a mi archivo con:

 Uri fileUri = FileProvider.getUriForFile(activity, "com.mydomain.appname.fileprovider", new File("/storage/emulated/0/AppName/IMG_20160419_095211.jpg")); 

Devuelve un error: java.lang.IllegalArgumentException: Error al encontrar la raíz configurada que contiene /storage/emulated/0/AppName/IMG_20160419_095211.jpg en android.support.v4.content.FileProvider $ SimplePathStrategy.getUriForFile (FileProvider.java:678 ) En android.support.v4.content.FileProvider.getUriForFile (FileProvider.java:377)

Funcionó muy bien antes cuando yo estaba utilizando el directorio incorporado como imágenes o películas, mi file_paths.xml se define así:

 <external-path name="photos" path="Pictures" /> <external-path name="videos" path="Movies" /> 

Pero ahora quiero almacenar mi archivo en mi propia carpeta. ¿He extrañado algo con la configuración de FileProvider?

En primer lugar, sé que se trata de una antigua publicación, pero es la pregunta más cercana publicado que era similar a mi problema, así que voy a publicar mi solución.

La razón de este error se debe a que la ruta que está proporcionando en el archivo de proveedor es

  • A) Se deletrea incorrectamente y no existe en la external-path
  • B) Utilizar la ruta absoluta /storage/emulated/0

Devuelve Failed to find configured root that contains ... porque no puede encontrar esa carpeta. Asegúrese de escribir sólo el directorio que desea compartir y asegúrese de que está escrito correctamente. Recuerde que cuando declara external-path es el equivalente de llamar a Enviornment.getExternalStorageDirectory() Ya que escribe el nombre del directorio cuando crea su archivo, no necesita proporcionar una path de path en su archivo de proveedor como todo lo que hace Es la máscara de cualquier valor que esté en la ruta con el nombre.

Así que su ruta del proveedor sería: <external-path name="my_files" />

Y su código sería:

 File file = new File(new File(Environment.getExternalStorageDirectory(), "myfolder"), "file.ext"); Uri uri = FileProvider.getUriForFile(context, fileProvider, file); 

Tu ruta uri daría entonces el siguiente

content://fileprovider/my_files/myfolder/file.ext

Si usted había proporcionado una ruta en su archivo de proveedor, entonces su ruta de acceso de uri se vería así:

content://fileprovider/my_files/file.ext

Yo tuve lo mismo. En mi caso tuve que limpiar la compilación en Android Studio (Build> Clean Project) cada vez que modificaba la ruta del fileprovider en 'file_paths.xml'.

  • Error de FileProvider
  • La intención de compartir imágenes funciona para Gmail pero bloquea FB y twitter
  • FileProvider produce excepción en GetUriForFile
  • FileProvider no funciona con la cámara
  • ¿Por qué usar un FileProvider? No puedo abrir el archivo desde INTERNAL STORAGE con aplicaciones externas.
  • Compartir imágenes almacenadas en caché utilizando FileProvider
  • Error al encontrar la raíz configurada que contiene
  • ¿Cómo puede hacer un FileProvider disponible para otras aplicaciones?
  • Cómo abrir un archivo APK para todas las versiones de Android
  • Android: FileProvider IllegalArgumentException Error al encontrar la raíz configurada que contiene /data/data/**/files/Videos/final.mp4
  • Error de FileProvider en los dispositivos Huawei
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.