Compartilhando arquivos no Android 7 (Nougat) e a exception FileUriExposedException

Posted by rlecheta on novembro 03, 2016
Android, Tutorial

É raro termos algum erro de compatibilidade ao atualizar as versões do Android no aplicativo, mas no caso do Android 7 (Nougat) temos a exception FileUriExposedException.

Se você ainda não se deparou com ela, logo irá.

Digamos que você possui um aplicativo que tire fotos. Para exemplificar, temos este trecho de código que cria um arquivo e chama a Intent da câmera:

screen-shot-2016-11-02-at-19-26-24

Tudo normal com o código certo? Mas se você atualizar o seu projeto para compilar com a API 24/25 (Android 7) verá uma exception igual esta:

screen-shot-2016-11-02-at-19-14-35

Segundo a documentação do Android, esta exception é lançada ao expor um arquivo por uma Uri para outra aplicação. Neste caso, o erro é porque estamos expondo o arquivo que criamos para a aplicação nativa da câmera, pois a câmera precisa salvar a foto neste arquivo.

https://developer.android.com/reference/android/os/FileUriExposedException.html

Sem mais demoras, vamos logo a solução:

Edite o arquivo AndroidManifest.xml e adicione a tag <provider> dentro da tag <application> .

Exemplo: AndroidManifest.xml

screen-shot-2016-11-02-at-19-19-45

Veja que dentro de <meta-data> é referenciado um arquivo XML @xml/provider_paths com a configuração de compartilhamento para os arquivos da aplicação, neste caso vamos colocar o “.”, para compartilhar tudo desde a raiz.

Exemplo: provider_paths.xml

screen-shot-2016-11-02-at-19-20-46

Feito estas configurações no projeto, basta trocar a linha que cria a Uri do arquivo:

Uri uri = Uri.fromFile(file);

Por esta:

Uri uri = FileProvider.getUriForFile(context, context.getApplicationContext().getPackageName() + “.provider”, file);

Então, o código que chama a Intent da câmera que mostrei anteriormente fica assim:

screen-shot-2016-11-02-at-19-33-55

Exemplo: CameraUtil.java

Pronto! Agora podemos tirar fotos no Android 7 (Nougat). Espero que esta dica ajude alguém 🙂

Para maiores informações, veja a documentação oficial.

device-2016-11-02-193556

3 Comments to Compartilhando arquivos no Android 7 (Nougat) e a exception FileUriExposedException

  • Boa tarde Ricardo,

    Preciso de uma ajuda, poderia me dizer como faço o upload de uma foto tirada pela câmera. Outra ajuda é como implemento a funcionalidade cobrar por mês no próprio aplicativo

    • Oi Raphael, no meu livro de web services (https://novatec.com.br/livros/webservices/) explico como criar web services RESTful no servidor, e tem também exemplos de file upload. Inclusive o livro acompanha uma demo de aplicativo Android que acessa estes web services. Tem exemplo de cadastro de carros, inclusive tirando foto pelo celular e enviando a foto do carro pro servidor. A questão de cobrar por mês nunca precisei fazer isso, sugiro que de uma pesquisada, abs.

  • Comprei a quinta edição, mas só vi a dica depois de procurar muito no Google. Acho que as notas de atualização de código deveriam vir no começo do tópico. Do mais, estou gostando do livro. Parabéns.