Selección de un archivo de imagen de la Galería mediante FileProvider

Compilando para Android N He enfrentado un problema de FileProvider . Necesito dejar a usuario para escoger la imagen de la galería / toma la imagen con la cámara entonces la cosecha a la plaza.

He conseguido poner en práctica un FileProvider para tomar la imagen con la cámara, pero tengo problema serio con la selección de la imagen de la galería. El problema es que en la galería hay muchos archivos de diferentes lugares y tengo la Excepción por ejemplo:

  java.lang.IllegalArgumentException: Failed to find configured root that contains /storage/6133-3766/DCIM/100ANDRO/DSC_0035.JPG 

Así que la pregunta es, ¿qué puedo poner en file_paths.xml para tener acceso a cualquier lugar en /storage/ . No puedo confiar en el camino exacto, ya que tal vez las imágenes de WhatsApp y aplicaciones similares, por ejemplo, la imagen de WhatsApp obtiene esta ruta de acceso:

 /storage/emulated/0/WhatsApp/Media/WhatsApp Images/IMG-20160821-WA0000.jpg 

Que he logrado resolver con el camino vacío:

<external-path name="external_storage" path=""/>

Que es similar a Environment.getExternalStorageDirectory() acuerdo con la documentación.

Pero todavía no puede averiguar cómo tratar con las imágenes que se almacenan en /storage/SOME_DIR/ . Por favor ayuda.

Creo que esta pregunta se basa en un malentendido.

El propósito de un FileProvider es conceder acceso (a una aplicación externa), a un archivo que ya controla su aplicación.

Nunca conseguirá utilizar su propio proveedor de archivos para obtener acceso a un archivo propiedad de una aplicación externa.

Depende de la aplicación externa concederle ese acceso utilizando un proveedor de archivos, si así lo desea.

Eso parece ser lo que la pregunta está pidiendo. Si no he entendido su pregunta, hágamelo saber, pero si lo entiendo, lo que está intentando hacer no funcionará.

De acuerdo con la respuesta de @ x-code no se describe muy claro sobre el tema, aunque si intenta acceder a los datos internos de otra aplicación, entonces debe tener permisos para hacerlo.

Los archivos que pertenecen a tu aplicación y que deben ser eliminados cuando el usuario desinstala tu aplicación. Aunque estos archivos son técnicamente accesibles por el usuario y otras aplicaciones porque están en el almacenamiento externo, son archivos que, de manera realista, no proporcionan valor al usuario fuera de la aplicación.

En realidad he encontrado en la documentación que el SDK versión 24 ahora está actualizado con muchos esquemas y tienen cambios masivos en el trabajo con archivos, desde la documentación el problema con file: // se describe como ..

Pasar archivo: // Los URI fuera del dominio del paquete pueden dejar al receptor con una ruta inaccesible. Por lo tanto, los intentos de pasar un archivo: // URI desencadenar un FileUriExposedException. La forma recomendada para compartir el contenido de un archivo privado es utilizar FileProvider.

Debido a razones de seguridad, se recomienda utilizar Content: // en lugar de usar file: // para utilizar básicamente ContentProvider en lugar de FileProvider .

Un ejemplo simple de usarlo es a continuación,

En AndroidMenifest.xml

 <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" ... <application ... <provider android:name="android.support.v4.content.FileProvider" android:authorities="${applicationId}.provider" android:exported="false" android:grantUriPermissions="true"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/provider_paths"/> </provider> </application> </manifest> 

A continuación, cree un archivo _paths.xml proveedor en la carpeta xml en la carpeta res . La carpeta puede ser necesaria para crear si no existe.

A continuación se muestra el contenido del archivo. Describe que nos gustaría compartir el acceso a la carpeta de almacenamiento externo en la carpeta raíz (path=".") Con el nombre external_files .

Res / xml / provider_paths.xml

 <?xml version="1.0" encoding="utf-8"?> <paths xmlns:android="http://schemas.android.com/apk/res/android"> <external-path name="external_files" path="."/> </paths> 

Ahora para usarlo,

 Uri photoURI = FileProvider.getUriForFile(MainActivity.this, BuildConfig.APPLICATION_ID + ".provider", createImageFile()); 

He tomado esto de este blog así que por favor lee para la comprensión completa. Espero que ayude a todos.

FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.