Solucionado (ver solução)
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