Solucionado (ver solução)
Solucionado
(ver solução)
5
respostas

App Trava ao clicar no botão camera

Segue mensagem de erro:

2019-01-09 16:01:16.470 6647-6647/br.com.teste.agenda E/AndroidRuntime: FATAL EXCEPTION: main
    Process: br.com.teste.agenda, PID: 6647
    android.os.FileUriExposedException: file:///storage/emulated/0/Android/data/br.com.teste.agenda/files/1547056876469.jpg exposed beyond app through ClipData.Item.getUri()
        at android.os.StrictMode.onFileUriExposed(StrictMode.java:1799)
        at android.net.Uri.checkFileUriExposed(Uri.java:2346)
        at android.content.ClipData.prepareToLeaveProcess(ClipData.java:845)
        at android.content.Intent.prepareToLeaveProcess(Intent.java:8941)
        at android.content.Intent.prepareToLeaveProcess(Intent.java:8926)
        at android.app.Instrumentation.execStartActivity(Instrumentation.java:1517)
        at android.app.Activity.startActivityForResult(Activity.java:4225)
        at android.support.v4.app.BaseFragmentActivityApi16.startActivityForResult(BaseFragmentActivityApi16.java:54)
        at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:68)
        at android.app.Activity.startActivityForResult(Activity.java:4183)
        at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:751)
        at android.app.Activity.startActivity(Activity.java:4522)
        at android.app.Activity.startActivity(Activity.java:4490)
        at br.com.teste.agenda.FormularioActivity$1.onClick(FormularioActivity.java:46)
        at android.view.View.performClick(View.java:5637)
        at android.view.View$PerformClick.run(View.java:22429)
        at android.os.Handler.handleCallback(Handler.java:751)
        at android.os.Handler.dispatchMessage(Handler.java:95)
        at android.os.Looper.loop(Looper.java:154)
        at android.app.ActivityThread.main(ActivityThread.java:6119)
        at java.lang.reflect.Method.invoke(Native Method)
        at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:886)
        at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:776)
5 respostas

Meu código da camera

 Button botaFoto = (Button) findViewById(R.id.formulario_botao_foto);
        botaFoto.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intentCamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                String caminhoFoto = getExternalFilesDir(null) + "/"+ System.currentTimeMillis() + ".jpg";
                File arquivoFoto = new File(caminhoFoto);
                intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(arquivoFoto));
                startActivity(intentCamera);
            }
        });

Versão

apply plugin: 'com.android.application'

android {
    compileSdkVersion 27
    defaultConfig {
        applicationId "br.com.teste.agenda"
        minSdkVersion 19
        targetSdkVersion 27
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation 'com.android.support:appcompat-v7:27.1.1'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

Olá Bruno!

Esse erro está acontecendo pois você está usando a API 27 ao invés da API 23 do video.

Se utilizamos uma API >= 24 precisamos utilizar a classe FileProvider para acessar.

Existe um tópico falando sobre isso: https://cursos.alura.com.br/forum/topico-android-os-fileuriexposedexception-26773

Espero ter ajudado! :D

Show Guilherme, deu certo!

Porém estou com uma dúvida, no códio dele

Button TirarFoto = (Button) findViewById(R.id.formulario_tirarfoto);
        TirarFoto.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intentTirarFoto = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                String caminhoFoto = getExternalFilesDir(null) + "/" + System.currentTimeMillis() + ".jpg";
                File foto = new File(caminhoFoto);
                Uri fotoURI = FileProvider.getUriForFile(FormularioActivity.this, BuildConfig.APPLICATION_ID + ".provider", foto);
                intentTirarFoto.putExtra(MediaStore.EXTRA_OUTPUT, fotoURI);
                startActivityForResult(intentTirarFoto, CODIGO_FOTO);
            }
        });

Tem essa útima linha aqui, essa contasnte CODIGO_FOTO precisa ser passada?

                startActivityForResult(intentTirarFoto, CODIGO_FOTO);

Meu código ficou assim:

Button botaFoto = (Button) findViewById(R.id.formulario_botao_foto);
        botaFoto.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intentCamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                String caminhoFoto = getExternalFilesDir(null) + "/"+ System.currentTimeMillis() + ".jpg";
                File arquivoFoto = new File(caminhoFoto);
                Uri fotoUri = FileProvider.getUriForFile(FormularioActivity.this,BuildConfig.APPLICATION_ID + ".provider",arquivoFoto);
                intentCamera.putExtra(MediaStore.EXTRA_OUTPUT, fotoUri);
                startActivity(intentCamera);
            }
        });

E deu tudo certo!

solução!

Resolvido, vi para que serve o CODIGO_FOTO na aula seguinte!!

Obrigado

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software