visor una studio seleccionar ruta para manipular imagenes imagen guardar galeria desde codigo cargar android android-gallery android-fileprovider

android - una - Escoger un archivo de imagen de la Galería usando FileProvider



seleccionar imagen de galeria android studio (2)

Creo que esta pregunta se basa en un malentendido.

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

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

Depende de la aplicación externa otorgarle ese acceso mediante un proveedor de archivos, si así lo decide.

Eso parece ser lo que la pregunta está pidiendo. Si no entendí tu pregunta, avísame, pero si la entiendo, lo que estás tratando de hacer simplemente no funcionará.

Compilando para Android N me enfrenté a un problema de FileProvider . Debo dejar que el usuario elija la imagen de la galería / tome una fotografía con la cámara y luego la recorte al cuadrado.

Me las arreglé para implementar un FileProvider para tomar una imagen con la cámara, pero tengo un problema serio al escoger una 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

Entonces, la pregunta es, ¿qué puedo poner en file_paths.xml para obtener acceso a cualquier lugar en /storage/ . No puedo confiar en la ruta exacta, ya que hay imágenes de WhatsApp y aplicaciones similares, por ejemplo, la imagen de WhatsApp obtiene esta ruta:

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

que he logrado resolver con la ruta vacía:

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

que es similar a Environment.getExternalStorageDirectory() acuerdo con la documentation.

Pero aún no puedo averiguar cómo tratar con las imágenes almacenadas en /storage/SOME_DIR/ . Por favor ayuda.


De acuerdo con la respuesta de , no se describe con claridad el problema, aunque si intenta acceder a los datos internos de otra aplicación, debe tener permisos para hacerlo.

Los archivos que pertenecen legítimamente a su aplicación y deben eliminarse cuando el usuario desinstala su aplicación. Aunque el usuario y otras aplicaciones pueden acceder a estos archivos desde el punto de vista técnico, ya que se encuentran en el almacenamiento externo, son archivos que, de manera realista, no proporcionan valor al usuario fuera de su aplicación.

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

Pasar file: // URIs fuera del dominio del paquete puede dejar al receptor con una ruta inaccesible. Por lo tanto, los intentos de pasar un archivo: // URI desencadenan una excepción FileUriExposedException. La forma recomendada de compartir el contenido de un archivo privado es usar FileProvider.

Debido a razones de seguridad, se recomienda encarecidamente utilizar Content: // en lugar de file: //, así que básicamente use ContentProvider en lugar de FileProvider .

Un ejemplo simple de usarlo es abajo,

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>

Y luego cree un archivo _paths.xml proveedor en la carpeta xml en la carpeta res . Carpeta puede ser necesaria para crear si no existe.

El contenido del archivo se muestra a continuación. Describe que nos gustaría compartir el acceso al 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 léelo para comprenderlo mejor. Espero que ayude a todos.