O segundo Visualização do Desenvolvedor do Android 11 já está disponível, teste e compartilhe seu feedback.

Como configurar o compartilhamento de arquivos

Para oferecer um arquivo do seu app para outro app 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 de Suporte v4. Para saber mais sobre como incluir essa biblioteca no app, consulte Configuração da Biblioteca de Suporte.

Especificar o FileProvider

A definição de um FileProvider para seu app requer 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="android.support.v4.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 de 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 por criar o arquivo filepaths.xml no subdiretório res/xml/ do seu projeto. Nesse arquivo, especifique os diretórios adicionando um elemento XML para cada diretório. 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>

Nesse exemplo, a tag <files-path> compartilha diretórios dentro do diretório files/ de 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 programaticamente um diretório.

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, o FileProvider retornará o seguinte URI:

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

Para ver outras informações relacionadas, consulte: