Para ofrecer de forma segura un archivo de tu app a otra, debes configurar tu app para que ofrezca un controlador seguro en forma de URI de contenido. El componente FileProvider
de Android genera URI de contenido para archivos, según las especificaciones que proporcionas en XML. En esta lección, se muestra cómo agregar la implementación predeterminada de FileProvider
a tu app y cómo especificar los archivos que deseas ofrecer a otras apps.
Nota: La clase FileProvider
forma parte de la biblioteca principal de AndroidX. Para obtener 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 debe usar en la generación de URIs de contenido, así como el nombre de un archivo XML que indica los directorios que la app puede compartir.
En el siguiente fragmento, se muestra cómo agregar al manifiesto el elemento <provider>
que especifica la clase FileProvider
, la autoridad y el nombre del 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 de URI que deseas usar para los URI de contenido generados por FileProvider
.
En el ejemplo, la autoridad es com.example.myapp.fileprovider
. Para tu app, especifica una autoridad que consista en el valor android:package
de la app con la cadena "fileprovider" adjunta. Para obtener más información sobre el valor de autoridad, consulta el tema URI de contenido y la documentación sobre el 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, deberás especificar los directorios que contienen los archivos que deseas compartir. Para especificar los directorios, primero crea el archivo filepaths.xml
en el subdirectorio res/xml/
de tu proyecto. En ese archivo, especifica los directorios agregando un elemento XML para cada uno. En el siguiente fragmento, se muestra un ejemplo del contenido de res/xml/filepaths.xml
. El fragmento también muestra cómo compartir un subdirectorio del directorio files/
en el á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 atributo name
le indica a FileProvider
que debe agregar el segmento de ruta de acceso myimages
a los URI de contenido para los archivos del subdirectorio files/images/
.
El elemento <paths>
puede tener varios elementos secundarios, cada uno de los cuales especifica un directorio diferente para compartir. Además del elemento <files-path>
, puedes usar el elemento <external-path>
para compartir directorios en el almacenamiento externo y el elemento <cache-path>
para compartir directorios en tu directorio de caché interno. Si quieres obtener más información sobre los elementos secundarios que especifican directorios compartidos, consulta la documentación de referencia de FileProvider
.
Nota: El archivo XML es la única manera de especificar los directorios que deseas compartir, ya que no es posible agregar un directorio de manera programática.
Ahora tienes una especificación completa de un FileProvider
que genera URI de contenido para archivos en el directorio files/
del almacenamiento interno de tu app o para archivos en subdirectorios de files/
. Cuando tu app genera un URI de contenido para un archivo, este 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 los fragmentos de esta lección y solicitas 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: