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 uma FileProvider de acordo com o
snippets desta lição e solicitar um URI de conteúdo para o arquivo
default_image.jpg, FileProvider retorna o
URI a seguir:
content://com.example.myapp.fileprovider/myimages/default_image.jpg
Para ver mais informações relacionadas, consulte: