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: