Cómo configurar el uso de archivos compartidos

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

A fin de definir un FileProvider para tu app, se requiere una entrada en el manifiesto que especifique la autoridad que se debe usar en la generación de URI de contenido, así como el nombre de un archivo XML que indique 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 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 la 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 agregaste el FileProvider al manifiesto de tu app, debes 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. 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 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> a fin de 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 FileProviderque genera URI de contenido para archivos del directorio files/ en el almacenamiento interno de tu app, o bien para archivos de 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: