Como configurar o compartilhamento de arquivos

Para oferecer um arquivo do seu app para outro com segurança, você precisa configurá-lo para oferecer um identificador seguro para o arquivo, na forma de um URI de conteúdo. O componente FileProvider do Android gera URIs de conteúdo para arquivos, com base em especificações fornecidas em XML. Esta lição mostra como adicionar a implementação padrão de FileProvider para o app e como especificar os arquivos que você quer oferecer a outros apps.

Observação: a classe FileProvider é parte da Biblioteca AndroidX Core. Para mais informações sobre como incluir essa biblioteca no app, consulte Como declarar dependências.

Especificar o FileProvider

A definição de um FileProvider para seu app exige uma entrada no manifesto. Essa entrada especifica a autoridade a ser usada na geração de URIs de conteúdo, bem como o nome de um arquivo XML que especifica os diretórios que o app pode compartilhar.

O snippet a seguir mostra como adicionar ao seu manifesto o elemento <provider> que especifica a classe FileProvider, a autoridade e o nome do arquivo 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>

Neste exemplo, o atributo android:authorities especifica a autoridade do URI que você quer usar para URIs de conteúdo gerados pelo FileProvider. No exemplo, a autoridade é com.example.myapp.fileprovider. Para seu app, especifique uma autoridade que consiste no valor do android:package do app com a string "fileprovider" anexada a ele. Para saber mais sobre o valor da autoridade, consulte o tópico URIs de conteúdo e a documentação do atributo android:authorities.

O elemento filho <meta-data> do <provider> aponta para um arquivo XML que especifica os diretórios que você quer compartilhar. O atributo android:resource é o caminho e o nome do arquivo, sem a extensão .xml. O conteúdo desse arquivo é descrito na próxima seção.

Especificar diretórios compartilháveis

Depois de adicionar o FileProvider ao manifesto do app, você precisa especificar os diretórios que contêm os arquivos que quer compartilhar. Para especificar os diretórios, comece com a criação do arquivo filepaths.xml no subdiretório res/xml/ do seu projeto. Nesse arquivo, especifique os diretórios adicionando um elemento XML para cada um deles. O snippet a seguir mostra um exemplo do conteúdo de res/xml/filepaths.xml. O snippet também demonstra como compartilhar um subdiretório do diretório files/ na área de armazenamento interno:

<paths>
    <files-path path="images/" name="myimages" />
</paths>

Neste exemplo, a tag <files-path> compartilha diretórios no diretório files/ do armazenamento interno do seu app. O atributo path compartilha o subdiretório images/ de files/. O atributo name diz ao FileProvider para adicionar o segmento de caminho myimages para URIs de conteúdo para arquivos no subdiretório files/images/.

O elemento <paths> pode ter vários filhos, cada um especificando um diretório diferente para compartilhar. Além do elemento <files-path>, você pode usar o elemento <external-path> para compartilhar pastas em armazenamento externo e o elemento <cache-path> para compartilhar diretórios no diretório de cache interno. Para saber mais sobre os elementos filhos que especificam diretórios compartilhados, consulte a documentação de referência do FileProvider.

Observação: o arquivo XML é a única maneira de você especificar os diretórios que quer compartilhar. Não é possível adicionar um diretório programaticamente.

Você agora tem uma especificação completa de um FileProvider que gera URIs de conteúdo para arquivos no diretório files/ de armazenamento interno do seu app ou para arquivos em subdiretórios de files/. Quando seu app gera um URI de conteúdo para um arquivo, ele contém a autoridade especificada no elemento <provider> (com.example.myapp.fileprovider), o caminho myimages/ e o nome do arquivo.

Por exemplo, se você definir um FileProvider de acordo com os snippets desta lição e solicitar um URI de conteúdo para o arquivo default_image.jpg, FileProvider retornará o seguinte URI:

content://com.example.myapp.fileprovider/myimages/default_image.jpg

Para ver mais informações relacionadas, consulte: