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:
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:
- Crie um pacote (pode dar qualquer nome eu chamei de provider)
- 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 {
}
- 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 ?
- 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