Cómo configurar el uso compartido de archivos

Para ofrecer un archivo de tu app a otra de forma segura, debes configurar tu app de modo 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 proporciones 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

Para definir un FileProvider para tu app, es necesario tener una entrada en el manifiesto. Esta entrada especifica la autoridad que se debe usar en la generación de URI de contenido, así como el nombre de un archivo en formato XML, que especifica los directorios que tu 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 quieres usar para los URI de contenido que genera FileProvider. En el ejemplo, la autoridad es com.example.myapp.fileprovider. Para tu propia app, especifica una autoridad que consista en el valor android:package de la app, con la string "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 en formato 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 este 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 agregue 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 deseas 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 del 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: