Si quieres ofrecer un archivo de tu app a otra de forma segura, debes configurar la app para que ofrezca
un controlador seguro del archivo, en forma de URI de contenido. Android
El componente FileProvider
genera URI de contenido para
de acuerdo con las especificaciones que proporciones en formato XML. En esta lección, se muestra cómo agregar
implementación de FileProvider
en tu app y cómo
especifica los archivos que quieres ofrecer a otras apps.
Nota: La clase FileProvider
forma parte del
Biblioteca principal de AndroidX. Información
sobre cómo incluir esta biblioteca en tu aplicación, consulta
Cómo declarar dependencias.
Cómo especificar el FileProvider
Definir un FileProvider
para tu app requiere una entrada en
tu manifiesto. Esta entrada especifica la autoridad que se usará para generar URI de contenido, así como
el nombre de un archivo en formato XML que especifique los directorios que puede compartir tu app.
En el siguiente fragmento, se muestra cómo agregar a tu manifiesto
<provider>
que especifica la
clase FileProvider
, la autoridad y el
Nombre de archivo XML:
<manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.myapp"> <application ...> <provider android:name="androidx.core.content.FileProvider" android:authorities="com.example.myapp.fileprovider" android:grantUriPermissions="true" android:exported="false"> <meta-data android:name="android.support.FILE_PROVIDER_PATHS" android:resource="@xml/filepaths" /> </provider> ... </application> </manifest>
En este ejemplo, el atributo android:authorities
especifica la autoridad del URI.
que deseas usar para los URI de contenido generados por la
FileProvider
En el ejemplo, la autoridad es com.example.myapp.fileprovider
. Para tu propio
específica de la app, especifica una autoridad que incluya
Valor android:package
con la cadena "fileprovider" agregado a ella. Para obtener más información
sobre el valor de autoridad, consulta el tema
URI de contenido y la documentación de las
atributo android:authorities
.
El elemento secundario <meta-data>
de
<provider>
apunta a un archivo XML que especifica los directorios que deseas.
compartir. El atributo android:resource
es la ruta de acceso y el nombre del archivo, sin
La extensión .xml
.El contenido de este archivo se describe en la siguiente sección.
Cómo especificar directorios para compartir
Una vez que hayas agregado el FileProvider
al manifiesto de tu app, haz lo siguiente:
debes especificar los directorios que contienen los archivos que deseas compartir. Para especificar
de Terraform, comienza por crear el archivo filepaths.xml
en el archivo res/xml/
subdirectorio de tu proyecto. En este archivo, especifica los directorios agregando un elemento XML para
cada directorio. El siguiente fragmento muestra un ejemplo del contenido de
res/xml/filepaths.xml
El fragmento también muestra cómo compartir un subdirectorio
del directorio files/
en tu área de almacenamiento interno:
<paths> <files-path path="images/" name="myimages" /> </paths>
En este ejemplo, la etiqueta <files-path>
comparte directorios dentro del
Directorio files/
del almacenamiento interno de tu app El atributo path
comparte el subdirectorio images/
de files/
. El name
el atributo le indica a FileProvider
que agregue el segmento de ruta de acceso
myimages
a los URIs de contenido de los archivos del subdirectorio files/images/
.
El elemento <paths>
puede tener varios elementos secundarios, cada uno de los cuales especifica un valor diferente
para compartir. Además del elemento <files-path>
, puedes
usar el elemento <external-path>
para compartir directorios en el almacenamiento externo
el elemento <cache-path>
para compartir directorios en tu caché interna
. Para obtener más información sobre los elementos secundarios que especifican directorios compartidos, consulta la
Es la documentación de referencia de FileProvider
.
Nota: El archivo en formato XML es la única manera de especificar los directorios que deseas. compartir; no puedes agregar un directorio de manera programática.
Ahora tienes una especificación completa de FileProvider
que genera URI de contenido para archivos en el directorio files/
del directorio
almacenamiento interno o para archivos en subdirectorios de files/
. Cuando tu app genera
un URI de contenido para un archivo, contiene la autoridad especificada en el
Elemento <provider>
(com.example.myapp.fileprovider
),
la ruta de acceso myimages/
y el nombre del archivo.
Por ejemplo, si defines un FileProvider
de acuerdo con el
fragmentos en esta lección, y solicitarás un URI de contenido para el archivo
default_image.jpg
, FileProvider
muestra el
siguiente URI:
content://com.example.myapp.fileprovider/myimages/default_image.jpg
Para obtener información adicional relacionada, consulta: