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

Problema com Acesso a câmera no Android

Usando o emulador do android com API 25, dá o seguinte erro.

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: br.com.caelum.agenda, PID: 8567
                  java.lang.RuntimeException: Unable to start activity ComponentInfo{br.com.caelum.agenda/br.com.caelum.agenda.FormularioActivity}: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.toString()' on a null object reference
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2665)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726)
                      at android.app.ActivityThread.-wrap12(ActivityThread.java)
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477)
                      at android.os.Handler.dispatchMessage(Handler.java:102)
                      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)
                   Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.toString()' on a null object reference
                      at br.com.caelum.agenda.FormularioHelper.preencheFormulario(FormularioHelper.java:60)
                      at br.com.caelum.agenda.FormularioActivity.onCreate(FormularioActivity.java:42)
                      at android.app.Activity.performCreate(Activity.java:6679)
                      at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1118)
                      at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2618)
                      at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2726) 
                      at android.app.ActivityThread.-wrap12(ActivityThread.java) 
                      at android.app.ActivityThread$H.handleMessage(ActivityThread.java:1477) 
                      at android.os.Handler.dispatchMessage(Handler.java:102) 
                      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) 
Application terminated.

Em seguida ao retirar o toSring(), aparece o erro

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: br.com.caelum.agenda, PID: 8864
                  android.os.FileUriExposedException: file:///storage/emulated/0/Android/data/br.com.caelum.agenda/files/1481573946488.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.BaseFragmentActivityJB.startActivityForResult(BaseFragmentActivityJB.java:48)
                      at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:77)
                      at android.app.Activity.startActivityForResult(Activity.java:4183)
                      at android.support.v4.app.FragmentActivity.startActivityForResult(FragmentActivity.java:859)
                      at br.com.caelum.agenda.FormularioActivity$1.onClick(FormularioActivity.java:57)
                      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)

Já vi na documentação que mudou a forma de acesso. Não pode mais ser por File, tem que ser por Uri. Mas não consegui resolver. Alguém pode me ajudar?

3 respostas

Opa Rayson, essa linha aqui me chamou atenção:

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.toString()' on a null object reference

at br.com.caelum.agenda.FormularioHelper.preencheFormulario(FormularioHelper.java:60)

Consegue postar o código do FormularioHelper e seu método preencheFormulario. Tem alguma referencia nula ali, vc pode tentar deixar uns logs para descobrir.


public class FormularioHelper {

    private final EditText nome;
    private final EditText endereco;
    private final EditText telefone;
    private final EditText site;
    private final RatingBar nota;
    private final ImageView campoFoto;
    private Aluno aluno;

    public FormularioHelper(FormularioActivity activity ){

        nome = (EditText) activity.findViewById(R.id.formulario_nome);
        endereco = (EditText) activity.findViewById(R.id.formulario_endereco);
        telefone = (EditText) activity.findViewById(R.id.formulario_telefone);
        site = (EditText) activity.findViewById(R.id.formulario_site);
        nota = (RatingBar) activity.findViewById(R.id.formulario_nota);
        campoFoto = (ImageView) activity.findViewById(R.id.formulario_foto);

        aluno = new Aluno();

    }

    public Aluno pegaAluno() {

        aluno.setNome(nome.getText().toString());
        aluno.setEndereco(endereco.getText().toString());
        aluno.setTelefone(telefone.getText().toString());
        aluno.setSite(site.getText().toString());
        aluno.setNota(Double.valueOf(nota.getProgress()));
        aluno.setCaminhoFoto((String) campoFoto.getTag());

        return aluno;
    }

    public void preencheFormulario(Aluno aluno) {
        nome.setText(aluno.getNome());
        endereco.setText(aluno.getEndereco());
        telefone.setText(aluno.getTelefone());
        site.setText(aluno.getSite());
        nota.setProgress(aluno.getNota().intValue());
        carregarImagem(aluno.getCaminhoFoto().toString());
        this.aluno = aluno;
    }

    public void carregarImagem(String caminhoFoto) {
        if(caminhoFoto != null) {
            Bitmap bitmap = BitmapFactory.decodeFile(caminhoFoto);
            Bitmap bitmapReduzido = Bitmap.createScaledBitmap(bitmap, 300, 300, true);
            campoFoto.setImageBitmap(bitmapReduzido);
            campoFoto.setScaleType(ImageView.ScaleType.FIT_XY);
            campoFoto.setTag(caminhoFoto);
        }
    }
}

Este erro,

Caused by: java.lang.NullPointerException: Attempt to invoke virtual method 'java.lang.String java.lang.String.toString()' on a null object reference

at br.com.caelum.agenda.FormularioHelper.preencheFormulario(FormularioHelper.java:60)

Quando eu uso o emulador, Nexus_API_23, esse erro não acontece. Porém, quando eu vou usar o emulador Nexus_API_25, dá o erro. Aí após retirar o toString aparece o segundo erro mostrado no início do fórum.

solução!

Oi Rayson, tudo bem ?

Pelo que entendi na versão 23 tá tudo ok, não é ?

Na versão 25 tem um outro problema, que eles julgaram que passar o arquivo na mão havia problema para isso temos que trocar de file:// para content://, para isso eles criaram uma classe que fornece o caminho com esse content://

https://developer.android.com/reference/android/support/v4/content/FileProvider.html

Lá tem um tutorial para que você consiga criar o arquivo, espero ter ajudado. Abraços