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

Erro ao salvar foto do aluno

Eu estou com o seguinte problema, eu seleciono um aluno para editá-lo, tiro uma foto e salvo, até ai tudo bem, quando volto da câmera para o formulário do aluno a sua respectiva foto está visível, mas quando eu clico em salvar e volto para o aluno que havia editado, a sua foto não está lá.

Vou colocar meus códigos abaixo para que vocês possam ver, espero que tenham alguma dica, ficarei muito agradecido.

Código do Cadastro:

    package com.example.cadastrocaelum;



    public class Cadastro extends Activity {

    private AlunoDAO db;
    private FormHelper helper;
    private Aluno alunoAlterar;
    private ImageView imagemFoto;
    private String caminhofoto;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_cadastro);

        alunoAlterar = (Aluno) getIntent().getSerializableExtra("AlunoAlterado");
        if (alunoAlterar!=null){
            helper = new FormHelper(Cadastro.this);
            helper.EditaCampos(alunoAlterar);
        }

        Button btncadastra = (Button) findViewById(R.id.cadastro_botao2);
        Button btnvolta = (Button) findViewById(R.id.cadastro_botao1);

        imagemFoto = (ImageView) findViewById(R.id.cadastro_foto);
        imagemFoto.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                caminhofoto = getExternalFilesDir(null) + "/" + System.currentTimeMillis()+".jpg";
                Uri caminho = Uri.fromFile(new File (caminhofoto));
                Intent abreCamera = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
                abreCamera.putExtra(MediaStore.EXTRA_OUTPUT, caminho);
                startActivity(abreCamera);
                startActivityForResult(abreCamera, 123);
            }
        });

        btncadastra.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                helper = new FormHelper(Cadastro.this);
                db = new AlunoDAO(Cadastro.this);
                Aluno aluno = helper.getAluno();    

                if (alunoAlterar==null){
                    db.insere(aluno);
                    Intent voltar = new Intent(Cadastro.this, Listagem.class);
                    startActivity(voltar);
                    Toast.makeText(Cadastro.this, "Aluno "+aluno.getNome() + " Cadastrado!", Toast.LENGTH_LONG).show();
                    db.close();
                    finish();
                }else{
                    aluno.setId(alunoAlterar.getId());
                    db.edita(aluno);
                    Intent voltar = new Intent(Cadastro.this, Listagem.class);
                    startActivity(voltar);
                    Toast.makeText(Cadastro.this, "Aluno "+aluno.getNome() +" Editado!", Toast.LENGTH_LONG).show();
                    db.close();
                    finish();
                }

            }
        });

        btnvolta.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {
                Intent voltar = new Intent(Cadastro.this, Listagem.class);
                startActivity(voltar);
                finish();
            }
        });
    }

    public ImageView pegaFoto(){
        return imagemFoto;
    }

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode==123){
            if (resultCode == Activity.RESULT_OK){
                helper.carregaFoto(caminhofoto);
            }else{
                this.caminhofoto=null;
            }
        }
    }
}
Código do AlunoDAO

    package com.example.cadastrocaelum;


    public class AlunoDAO extends SQLiteOpenHelper{

    public AlunoDAO(Context context) {
        super(context, NOME, null, VERSION);
    }

    private static String NOME = "AlunoTable";    
    private static int VERSION =2; 

    @Override
    public void onCreate(SQLiteDatabase db) {
        String sql = "CREATE TABLE IF NOT EXISTS "+ NOME + " (id INTEGER PRIMARY KEY, " 
                                                                                + "nome TEXT UNIQUE NOT NULL, "
                                                                        + "telefone TEXT, "
                                                                        + "endereco TEXT, "
                                                                        + "site TEXT, "
                                                                        + "nota REAL, "
                                                                        + "destinofoto TEXT"
                                                                        +");";
        db.execSQL(sql);

    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
        String sql = "DROP TABLE IF EXISTS " + NOME + ";";
        db.execSQL(sql);
        onCreate(db);
    }

    public ContentValues valores(Aluno aluno) {

        ContentValues cv = new ContentValues();

        cv.put("nome", aluno.getNome());
        cv.put("telefone", aluno.getTelefone());
        cv.put("endereco", aluno.getEndereco());
        cv.put("site", aluno.getSite());
        cv.put("nota", aluno.getNota());
        cv.put("destinofoto", aluno.getDestinofoto());

        return cv;

    }

    public void insere(Aluno aluno){
        getWritableDatabase().insert(NOME, null, valores(aluno));
    }

    public List<Aluno> getLista() {
        List<Aluno> alunos = new ArrayList<Aluno>();
        String sql = "SELECT * FROM "+NOME+";";
        Cursor c = getReadableDatabase().rawQuery(sql, null);

        while(c.moveToNext()){
            Aluno aluno = new Aluno();
            aluno.setId(c.getLong(c.getColumnIndex("id")));
            aluno.setNome(c.getString(c.getColumnIndex("nome")));
            aluno.setTelefone(c.getString(c.getColumnIndex("telefone")));
            aluno.setEndereco(c.getString(c.getColumnIndex("endereco")));
            aluno.setSite(c.getString(c.getColumnIndex("site")));
            aluno.setNota(c.getDouble(c.getColumnIndex("nota")));
            aluno.setDestinofoto(c.getString(c.getColumnIndex("destinofoto")));
            alunos.add(aluno);
        }
        c=null;
        return alunos;
    }

    public void deletar(Aluno aluno) {
        String[] args = {String.valueOf(aluno.getId())};
        getWritableDatabase().delete(NOME, "id=?", args);
    }

    public void edita(Aluno alunoalterado) {
        String[] args = {String.valueOf(alunoalterado.getId())};

        ContentValues cv = new ContentValues();

        cv.put("nome", alunoalterado.getNome());
        cv.put("telefone", alunoalterado.getTelefone());
        cv.put("endereco", alunoalterado.getEndereco());
        cv.put("site", alunoalterado.getSite());
        cv.put("nota", alunoalterado.getNota());
        cv.put("destinofoto", alunoalterado.getDestinofoto());

        getWritableDatabase().update(NOME, cv, "id=?", args);
    }

}
Código do FormHelper

    package com.example.cadastrocaelum;



    private EditText campoNome;
    private EditText campoEndereco;
    private EditText campoSite;
    private EditText campoTelefone;
    private ProgressBar campoNota;
    private Aluno aluno;
    private ImageView campoFoto;


    public FormHelper(Cadastro activity){

        aluno = new Aluno();
        campoNome = (EditText) activity.findViewById(R.id.cadastro_nome);
        campoEndereco = (EditText) activity.findViewById(R.id.cadastro_endereco);
        campoSite = (EditText) activity.findViewById(R.id.cadastro_site);
        campoTelefone = (EditText) activity.findViewById(R.id.cadastro_telefone);
        campoNota = (SeekBar) activity.findViewById(R.id.cadastro_nota);
        campoFoto = (ImageView) activity.findViewById(R.id.cadastro_foto);
    }

    public Aluno getAluno(){

        String Nome = campoNome.getText().toString();
        String Endereco = campoEndereco.getText().toString();
        String Site = campoSite.getText().toString();
        String Telefone = campoTelefone.getText().toString();
        int Nota = campoNota.getProgress();

        aluno.setNome(Nome);
        aluno.setEndereco(Endereco);
        aluno.setSite(Site);
        aluno.setTelefone(Telefone);
        aluno.setNota(Double.valueOf(Nota));

        return aluno;
    }

    public void EditaCampos(Aluno alunoAlter){

        campoNome.setText(alunoAlter.getNome());
        campoEndereco.setText(alunoAlter.getEndereco());
        campoSite.setText(alunoAlter.getSite()); 
        campoTelefone.setText(alunoAlter.getTelefone());
        campoNota.setProgress(alunoAlter.getNota().intValue());

        if (alunoAlter.getDestinofoto() != null ){
            carregaFoto(aluno.getDestinofoto());
        }

    }

    public void carregaFoto(String caminhofoto) {
        Bitmap foto = BitmapFactory.decodeFile(caminhofoto);
        Bitmap fotoredux = Bitmap.createScaledBitmap(foto, 100, 100, true);
        aluno.setDestinofoto(caminhofoto);
        campoFoto.setImageBitmap(fotoredux);
    }


    }

Eu percebi que toda a vez que vou criar um aluno e imediantamente tirar uma foto para ele, a aplicação para com as seguintes entradas no logcat:

12-04 03:40:30.289: E/AndroidRuntime(2431): FATAL EXCEPTION: main
12-04 03:40:30.289: E/AndroidRuntime(2431): java.lang.RuntimeException: Failure delivering result ResultInfo{who=null, request=123, result=-1, data=null} to activity {com.example.cadastrocaelum/com.example.cadastrocaelum.Cadastro}: java.lang.NullPointerException

Se alguém puder ajudar, será de grande ajuda

5 respostas

Olá Alecsander!

Conferi o seu código e achei o que deve estar causando o erro. Dá uma olhadinha no método EditaCampos(...) da classe ``FormHelper```:

class FormHelper {
    public FormHelper(Cadastro activity){
        aluno = new Aluno();
        ...
    }

    public void EditaCampos(Aluno alunoAlter){

        campoNome.setText(alunoAlter.getNome());
        campoEndereco.setText(alunoAlter.getEndereco());
        campoSite.setText(alunoAlter.getSite()); 
        campoTelefone.setText(alunoAlter.getTelefone());
        campoNota.setProgress(alunoAlter.getNota().intValue());

        if (alunoAlter.getDestinofoto() != null ){
            carregaFoto(aluno.getDestinofoto());
        }
    }
}

Repare que nesse método, na linha que carrega a foto, o destino foto está vindo do objeto aluno. Como esse objeto aluno, é criado do zero no construtor do FormHelper então ele não possui um caminho válido para a foto. Acredito que aqui basta ler o caminho foto do alunoAlter que é o que está vindo como parâmetro e cujos dados devem ser apresentados no formulário, ok?

Faça esse teste e depois volte para contar se deu certo!

Abraço!

Infelizmente eu já havia percebido isso e mudado, e não é isso que causa o erro, já até troquei de emulador e continua a mesma coisa, uma coisa estranha que acontece é que toda a vez que eu vou tirar a foto, eu tenho que tirar 2 fotos, por exemplo, eu tiro uma e aceito e logo depois a câmera abre de novo e me pede para tirar outra foto e somente apos eu aceitar a segunda, a tela de cadastro volta e a foto fica ali até eu salvar, mas quando eu volto ela continua a não aparecer.

Eu descobri o motivo de a câmera estar abrindo duas vezes, eu estava dando um startActivity e logo após um startActivityForResult, mudei isso e agora posso tirar apenas uma foto, mas isso ainda não arrumou o problema...

solução!

Olá Alecsander!

Olhei novamente seu código e acho que o problema está sendo que o FormHelper está sendo instanciado uma segunda vez no clique do botão salvar e com isso os dados da foto do aluno estão se perdendo. Para resolver isso, geralmente instanciamos o FormHelper uma única vez no método onCreate(). Em nenhum outro lugar você poderá instanciar o helper novamente. Utilize o código abaixo como referência:

public class Cadastro extends Activity {

    private AlunoDAO db;
    private FormHelper helper;
    private Aluno alunoAlterar;
    private ImageView imagemFoto;
    private String caminhofoto;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_cadastro);

        helper = new FormHelper(Cadastro.this);

        alunoAlterar = (Aluno) getIntent().getSerializableExtra("AlunoAlterado");
        if (alunoAlterar!=null){
            helper.EditaCampos(alunoAlterar);
        }

        // código que já tinha aqui

        btncadastra.setOnClickListener(new OnClickListener() {

            @Override
            public void onClick(View v) {

                // Aqui não vamos instanciar novamente o helper
                // helper = new FormHelper(Cadastro.this);

                db = new AlunoDAO(Cadastro.this);
                Aluno aluno = helper.getAluno();    

                if (alunoAlterar==null){
                    db.insere(aluno);
                    Intent voltar = new Intent(Cadastro.this, Listagem.class);
                    startActivity(voltar);
                    Toast.makeText(Cadastro.this, "Aluno "+aluno.getNome() + " Cadastrado!", Toast.LENGTH_LONG).show();
                    db.close();
                    finish();
                }else{
                    aluno.setId(alunoAlterar.getId());
                    db.edita(aluno);
                    Intent voltar = new Intent(Cadastro.this, Listagem.class);
                    startActivity(voltar);
                    Toast.makeText(Cadastro.this, "Aluno "+aluno.getNome() +" Editado!", Toast.LENGTH_LONG).show();
                    db.close();
                    finish();
                }

            }
        });

}

Faça o teste para ver se funciona!

Abraço!

Incrível!, era isso mesmo Jeferson, muito obrigado pela resposta.

Abraço!