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

Problema com a câmera

O Erro é esse seguinte Intent intentImage = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); String caminhoFoto = getExternalFilesDir(null) + "/"+ System.currentTimeMillis() +".jpg"; File arquivoFoto = new File(caminhoFoto); intentImage.putExtra(MediaStore

Antes de eu adicionar o seguinte código

String caminhoFoto = getExternalFilesDir(null) + "/"+ System.currentTimeMillis() +".jpg";
                File arquivoFoto = new File(caminhoFoto);
                intentImage.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(arquivoFoto));

Ele funcionava normalmente, eu estava conseguindo abrir câmera e tudo, mas foi só colocar esse código e ele aprestou o erro acima.

8 respostas

Corrigindo o erro não é esse

Intent intentImage = new Intent(MediaStore.ACTION_IMAGE_CAPTURE); String caminhoFoto = getExternalFilesDir(null) + "/"+ System.currentTimeMillis() +".jpg"; File arquivoFoto = new File(caminhoFoto); intentImage.putExtra(MediaStore

É esse

FATAL EXCEPTION: main
                  Process: br.com.viniciusdeep.agenda, PID: 22038
                  android.os.FileUriExposedException: file:///storage/emulated/0/Android/data/br.com.viniciusdeep.agenda/files/1524003224785.jpg exposed beyond app through ClipData.Item.getUri()

Olá Vinicius,

Para conseguir te ajudar vou te pedir pra postar aqui o código completo da sua FormularioActivity, do AndroidManifest.xml e do res/xml/provider_paths.xml.

Assim que possível já verifico seu código pra gente tentar entender o que está acontecendo.

package br.com.viniciusdeep.agenda;

import android.content.Intent;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v4.content.FileProvider;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.Menu;
import android.view.MenuInflater;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.Toast;

import java.io.File;
import java.util.List;

import br.com.viniciusdeep.agenda.Dao.AlunoDao;
import br.com.viniciusdeep.agenda.modelo.Aluno;

public class FormularioActivity extends AppCompatActivity {


    private FormularioHelper helper;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_formulario);
        Toolbar toolbar = findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);
        Intent intent = getIntent();
        Aluno aluno = (Aluno) intent.getSerializableExtra("aluno"); //Recuperar dados do aluno, e colocar na variável aluno na vaserialazable
        helper = new FormularioHelper(this);
        if(aluno != null) {
            helper.preencheFormulario(aluno);
        }

        Button button_image = (Button) findViewById(R.id.formulario_button_image);
        button_image.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent intentImage = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                String caminhoFoto = getExternalFilesDir(null) + "/"+ System.currentTimeMillis() +".jpg";



                File arquivoFoto = new File(caminhoFoto);
//                intentImage.setFlags(Intent.FLAG_GRANT_WRITE_URI_PERMISSION);
//                intentImage.setFlags(Intent.FLAG_GRANT_READ_URI_PERMISSION);

                intentImage.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(arquivoFoto));
                startActivity(intentImage);


            }
        });



    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        MenuInflater menuInflater = getMenuInflater();
        menuInflater.inflate(R.menu.menu_formulario, menu);
        return super.onCreateOptionsMenu(menu);
    }


    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        switch (item.getItemId()){
            case R.id.menu_ok:
                Aluno aluno = helper.pegaAluno();
                AlunoDao dao = new AlunoDao(this);

                if(aluno.getId() != null){
                    dao.altera(aluno);
                }else{
                    dao.insert(aluno);
                }


                dao.close();
                Toast.makeText(FormularioActivity.this, "Aluno " + aluno.getNome() + " salvo!", Toast.LENGTH_SHORT).show();
                finish();
                break;
        }
        return super.onOptionsItemSelected(item);
    }





}

Manifest:

<?xml version="1.0" encoding="utf-8"?>
<manifest xmlns:android="http://schemas.android.com/apk/res/android"
    package="br.com.viniciusdeep.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"
            android:label="@string/app_name"
            android:theme="@style/AppTheme.NoActionBar">

            <intent-filter>
                <action android:name="android.intent.action.MAIN" />

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


        </activity>
        <activity
            android:name=".FormularioActivity"
            android:label="@string/title_activity_formulario"
            android:theme="@style/AppTheme.NoActionBar">
        </activity>

        <provider
            android:name="android.support.v4.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>

Fiz algumas tentativas de permitir com setFlags

Olá Vinicius,

No provider que você colocou no AndroidManifest.xml você tem a seguinte instrução:

 <provider
    android:authorities="com.example.myapp.fileprovider"
    ...

Repare que a autorização está sendo fornecida para um pacote que não é da sua aplicação. Precisamos mudar isso pra que a permissão seja dada para o provider da nossa aplicação, então a instrução ficaria assim:

<provider
    android:authorities="${applicationId}.provider"
    ...

Tenta fazer essa alteração pra ver se já é o suficiente.

Aproveita e posta também aqui o conteúdo do arquivo provider_paths.xml que ficou faltando pra gente verificar.

<?xml version="1.0" encoding="utf-8"?>
<paths xmlns:android="http://schemas.android.com/apk/res/android">
    <external-path name="external_files" path="."/>
</paths>

android:authorities="${applicationId}.provider" ...

Mesmo com essa alteração o program crasha

solução!

Ok, agora precisamos alterar o código na FormularioActivity que faz a configuração da intent, precisamos trocar o código abaixo:

intentImage.putExtra(MediaStore.EXTRA_OUTPUT, Uri.fromFile(arquivoFoto));

por:

intentImage.putExtra(MediaStore.EXTRA_OUTPUT, 
            FileProvider.getUriForFile(FormularioActivity.this, 
                BuildConfig.APPLICATION_ID + ".provider", arquivoFoto));

Opa professor, muito obrigado, agora vou poder tá dando continuiadade a meus estudos de android, obrigado mesmo.

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