Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Solução FileUriExposedException

Boa noite gente !

ao tentar seguir o passo a passo do segundo vídeo da aula 2, quando tentei clicar no botão para tirar a foto recebi uma exceção:

android.os.FileUriExposedException: file:///storage/emulated/0/ exposed beyond app through Intent.getData()

Então pesquisando rapidinho no Google achei a solução, deixo aqui caso alguém mais precise:

https://stackoverflow.com/questions/38200282/android-os-fileuriexposedexception-file-storage-emulated-0-test-txt-exposed

Explicando a solução:

A partir da targetSdkVersion 24 o Google mudou a forma como acessamos o armazenamento, por motivos de segurança, para que o acesso ao diretório da aplicação seja garantido somente pela aplicação em questão e não por outras aplicações.

A solução é criar um FileProvider, então lá vai o passo a passo da soluão:

  1. Crie um pacote (pode dar qualquer nome eu chamei de provider)
  2. Nesse pacote crie uma classe dei o nome criativo de GenericFileProvider (rsrsrsr)
package br.com.jorgerabellodev.agenda.provider;

import android.support.v4.content.FileProvider;

public class GenericFileProvider extends FileProvider {
}
  1. Abra seu AndroiManifest e dentro da tag application declare o provider:
        <!-- FileProvider -->
        <provider
            android:name=".provider.GenericFileProvider"
            android:authorities="${applicationId}.br.com.jorgerabellodev.agenda.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths" />
        </provider>

O arquivo AndroidManifest vai ficar assim:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="br.com.jorgerabellodev.agenda">

    <uses-permission android:name="android.permission.CALL_PHONE" />

    <application
        android:allowBackup="true"
        android:icon="@mipmap/ic_launcher"
        android:label="@string/app_name"
        android:roundIcon="@mipmap/ic_launcher_round"
        android:supportsRtl="true"
        android:theme="@style/AppTheme">
        <activity android:name=".ListaAlunosActivity">
            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

                <category android:name="android.intent.category.LAUNCHER" />
            </intent-filter>
        </activity>
        <activity android:name=".FormularioActivity" />

        <!-- FileProvider -->
        <provider
            android:name=".provider.GenericFileProvider"
            android:authorities="${applicationId}.br.com.jorgerabellodev.agenda.provider"
            android:exported="false"
            android:grantUriPermissions="true">
            <meta-data
                android:name="android.support.FILE_PROVIDER_PATHS"
                android:resource="@xml/provider_paths" />
        </provider>

    </application>

</manifest>

Atente-se aos nomes dos pacotes e classes ok ?

  1. Agora por fim altere o listener na activity
        Button botaoFoto = findViewById(R.id.formulario_botao_foto);
        botaoFoto.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                Intent intentCamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                String caminhoFoto = getExternalFilesDir(null) + "/foto.jpg";
                File arquivoDaFoto = new File(caminhoFoto);
                Uri uri = FileProvider.getUriForFile(getBaseContext(), getBaseContext().getApplicationContext().getPackageName() + ".br.com.jorgerabellodev.agenda.provider", arquivoDaFoto);
                intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, uri);
                startActivity(intentCamera);
            }
        });

É um pouco trabalhoso, mas funcionou pra mim, se alguem mais souber de alguma forma melhor por favor comente aqui !

PS: Esse código completo está em: https://bitbucket.org/jorge_rabello/

Valeu galerinha =D

1 resposta
solução!

Solução acima espero que ajude alguém !