Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

Solucionado
(ver solução)
11
respostas

Erro capturar imagem (Aula 2)

Olá pessoal, está acontecendo essa Exception quando eu clico para tirar a foto, e logo em seguida em Salvar.

Estou debugando no meu Galaxy S3 mini. O que acontece nesse caso? É por causa que o data do parametro onActivityResult está vindo null?

08-22 11:21:56.544 4957-4957/br.com.daniel.agenda E/AndroidRuntime: FATAL EXCEPTION: main
                                                                    java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=587, result=-1, data=null} to activity {br.com.daniel.agenda/br.com.daniel.agenda.FormularioActivity}: java.lang.NullPointerException
                                                                        at android.app.ActivityThread.deliverResults(ActivityThread.java:3187)
11 respostas

Daniel, como está ?

Cara está levando uma exceção de referência nula, posta o código do formulario helper e o formulario activity para vermos aonde está acontecendo isso ?

Abraços :D

package br.com.daniel.agenda;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.util.Log;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.RatingBar;

import br.com.daniel.agenda.modelo.Aluno;

/**
 * Created by Daniel on 16/08/2016.
 */
public class FormularioHelper {

    private Aluno aluno;
    private EditText campoTelefone;
    private EditText campoEndereco;
    private EditText campoNome;
    private RatingBar campoNota;
    private ImageView campoFoto;

    public FormularioHelper(FormularioActivity activity){
        aluno = new Aluno();
        campoNome = (EditText) activity.findViewById(R.id.formulario_nome);
        campoEndereco= (EditText) activity.findViewById(R.id.formulario_endereco);
        campoTelefone = (EditText) activity.findViewById(R.id.formulario_telefone);
        campoNota = (RatingBar) activity.findViewById(R.id.formulario_nota);
        campoFoto = (ImageView) activity.findViewById(R.id.formulario_foto);
    }

    public Aluno getAluno(){
        aluno.setNome(campoNome.getText().toString());
        aluno.setEndereco(campoEndereco.getText().toString());
        aluno.setTelefone(campoTelefone.getText().toString());
        aluno.setNota(Double.valueOf(campoNota.getProgress()));
        aluno.setCaminhoFoto((String) campoFoto.getTag());
        return aluno;
    }

    public void preencheFormulario(Aluno aluno) {
        campoNome.setText(aluno.getNome());
        campoEndereco.setText(aluno.getEndereco());
        campoTelefone.setText(aluno.getTelefone());
        campoNota.setProgress((int) aluno.getNota());
        carregaImagem(aluno.getCaminhoFoto());
        this.aluno = aluno;
    }

    public void carregaImagem(String dirFoto) {
        if(dirFoto != null) {
            Bitmap bitmap = BitmapFactory.decodeFile(dirFoto);
            Bitmap bitmapReduzido = Bitmap.createScaledBitmap(bitmap, 300, 300, true);
            campoFoto.setImageBitmap(bitmapReduzido);
            campoFoto.setScaleType(ImageView.ScaleType.FIT_XY);
            campoFoto.setTag(dirFoto);
            Log.v("campoFoto", "foto ok");
        }
    }
}
package br.com.daniel.agenda;

import android.app.Activity;
import android.content.Intent;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.os.PersistableBundle;
import android.provider.MediaStore;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.util.Log;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.ImageView;
import android.widget.Toast;

import java.io.File;
import java.io.IOException;

import br.com.daniel.agenda.dao.AlunoDAO;
import br.com.daniel.agenda.modelo.Aluno;

public class FormularioActivity extends AppCompatActivity {

    private FormularioHelper helper;
    private final static int CODIGO_CAMERA = 587;
    private String dirFoto;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_formulario);
        helper = new FormularioHelper(this);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        Intent intent = getIntent();
        Aluno aluno = (Aluno) intent.getSerializableExtra("aluno");

        if(aluno != null){
            helper.preencheFormulario(aluno);
        }

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

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if(resultCode == Activity.RESULT_OK) {
            if (requestCode == CODIGO_CAMERA) {
                helper.carregaImagem(dirFoto);
                Log.v("Caminho imagem",dirFoto);
            }
        }
    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.menu_formulario, menu);

        return super.onCreateOptionsMenu(menu);
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {

        switch(item.getItemId()){
            case R.id.formulario_menu_salvar:
                Aluno aluno = helper.getAluno();
                AlunoDAO dao = new AlunoDAO(this);

                if(aluno.getId() != null){
                    dao.update(aluno);
                    Toast.makeText(FormularioActivity.this, "Aluno modificado!", Toast.LENGTH_SHORT).show();
                }else {
                    dao.insert(aluno);
                    Toast.makeText(FormularioActivity.this, "Aluno salvo!", Toast.LENGTH_SHORT).show();
                }

                finish();
                break;
        }

        return super.onOptionsItemSelected(item);
    }
}

Daniel, seu código aparemente está correto, você está rotacionando o celular ?

Porque se estiver, a grande parte dos dispositivos, não tem um tratamento para isso, pois ele irá iniciar novamente o ciclo de vida fazendo com que perca as informações que você enviou.

Faz um teste caso esteja rotacionando o celular.

Conta para gente se deu certo ou não.

Abraços

Obrigado pelo retorno Matheus!

Abraços

Eu tirei a foto com o celular em pé e virado e continua com o mesmo erro.

Inclusive, andei pesquisando e pelo que parece algumas versões do Galaxy, ou não se se falar se é do android, depois que eu tiro a foto, ela da a opção de Cancelar ou Salvar em outra tela e não na mesma tela em que se tira a foto, então alguns dizem que isso faz com que se crie outra intent, e se perca.

Porém não sei o que fazer.

Daniel,

A samsung, por reescrever boa parte do código fonte do Android para poder usar a sua parte, que é o TouchWiz.

Alguns problemas acontecem apenas em Samsung, o que eu sugiro você a fazer é testa no emulador e ver se o problema persiste.

Eu testei no celular do meu irmao, um Moto X, e funcionou a questão de tirar a foto, ela só não ficou expandida igual no exemplo da aula.

solução!

Matheus eu por curiosidade, instalei uma nova ROM Custom no meu celular com android lolipop 5.1 e agora a camera ta funcionado OK.

Tirei o TouchWiz padrão do celular.

Como te disse, o problema as vezes é a implementação da Samsung, a grande maioria tenta apenas mexer na parte de design, mas eles mexem bastante no codigo fonte das funcionalidades...

Não se assuste se em algum momento estiver desenvolvendo e algum samsung apresentar um erro bem sinistro... é algo super comum