3
respostas

Como rotacionar a foto para ser exibida na lista?

O código para rotacionar a foto no formulário continua funcionando parcialmente.A foto é rotacionada no formulário, mas não consigo rotacionar as fotos que ficam na lista.Estas fotos são as miniaturas que ficam na imagem de cada aluno. O botão de tirar a foto executa corretamente e o método

private static Bitmap abreFotoERotaciona(String caminhoFoto, int angulo) { } 

faz a rotação e salva no formulário, mas quando vai pra lista a foto fica invertida novamente. Classe CarregadorDeFoto:

package br.com.alura.schedule;
import android.graphics.Bitmap; 
import android.graphics.BitmapFactory; 
import android.graphics.Matrix;
import android.media.ExifInterface;
import android.widget.ImageView; 
import java.io.IOException;


public class CarregadorDeFoto {
public static Bitmap carrega(String caminhoFoto) {

    ExifInterface exif = null;
    try {
        exif = new ExifInterface(caminhoFoto);
    } catch (IOException e) {
        e.printStackTrace();
    }
    String orientacao = exif.getAttribute(ExifInterface.TAG_ORIENTATION);
    int codigoOrientacao = Integer.parseInt(orientacao);

        switch (codigoOrientacao) {
            case ExifInterface.ORIENTATION_NORMAL:
                return abreFotoERotaciona(caminhoFoto, 0);
            case ExifInterface.ORIENTATION_ROTATE_90:
                return abreFotoERotaciona(caminhoFoto, 90);
            case ExifInterface.ORIENTATION_ROTATE_180:
                return abreFotoERotaciona(caminhoFoto, 180);
            case ExifInterface.ORIENTATION_ROTATE_270:
                return abreFotoERotaciona(caminhoFoto, 270);
            default:
                return abreFotoERotaciona(caminhoFoto, 0);

        }
}

private static Bitmap abreFotoERotaciona(String caminhoFoto, int angulo) {
    // Abre o bitmap a partir do caminho da foto
    Bitmap bitmap = BitmapFactory.decodeFile(caminhoFoto);

    // Prepara a operação de rotação com o ângulo escolhido
    Matrix matrix = new Matrix();
    matrix.postRotate(angulo);

    // Cria um novo bitmap a partir do original já com a rotação aplicada
    return Bitmap.createBitmap(bitmap, 0, 0,
            bitmap.getWidth(), bitmap.getHeight(),
            matrix, true);
}
}

E aqui está a classe FormularioHelper com o trecho do código que chama o CarregadorDeFoto.carrega(caminhoFoto); >>>

public void carregaImagem(String caminhoFoto) {
    if (caminhoFoto !=null){

            Bitmap bitmap = CarregadorDeFoto.carrega(caminhoFoto);
            Bitmap bitmapReduzido = Bitmap.createScaledBitmap(bitmap, 100, 100, true);
            campoFoto.setImageBitmap(bitmapReduzido);
            campoFoto.setScaleType(ImageView.ScaleType.FIT_XY);
            campoFoto.setTag(caminhoFoto);//associa a imagem com o caminho da foto*/
    }
}

Eu chamei o método no adapter da lista, infelizmente não funcionou.Na hora da execução acontece um crash e o aplicativo é finalizado. Aí está o trecho do código ListaAlunosActivity que causa o problema:

@NonNull
private ListView carregaLista() {
    AlunoDAO dao = new AlunoDAO(this);
    List<Aluno> alunos = dao.buscaAlunos();
    dao.close();
    helper.carregaImagem(aluno.getCaminhoFoto());/* Carregando foto para rotacionar  novamente e poder exibir na lista*/

    AlunosAdapter adapter = new AlunosAdapter(this, alunos);
    listaAlunos.setAdapter(adapter);
    return listaAlunos;
}

Ainda pensei em colocar a chamada do helper.carregaImagem(aluno.getCaminhoFoto()) neste trecho do AlunoDAO, mas iria desviar um pouco do padrão MVC, ja que o código SQL do DAO iria se misturar com código das Activities.Além disso acho que não adiantaria:

List alunos = new ArrayList(); while (c.moveToNext()) { Aluno aluno = new Aluno(); aluno.setId(c.getLong(c.getColumnIndex("id"))); 
aluno.setNome(c.getString(c.getColumnIndex("nome"))); aluno.setEndereco(c.getString(c.getColumnIndex("endereco"))); 
aluno.setTelefone(c.getString(c.getColumnIndex("telefone"))); aluno.setSite(c.getString(c.getColumnIndex("site"))); 
aluno.setNota(c.getDouble(c.getColumnIndex("nota"))); aluno.setCaminhoFoto(c.getString(c.getColumnIndex("caminhoFoto")));

helper.carregaImagem(aluno.getCaminhoFoto());

            alunos.add(aluno);

        }
    c.close();

A questão é que eu não sei como pegar individualmente o caminhoFoto() de cada aluno da lista antes de chamar o helper.carregaImagem(aluno.getCaminhoFoto()).Como vou pegar o caminhoFoto de cada aluno antes deles serem colocados no listaAlunos.setAdapter(adapter)???

3 respostas

Se alguém poder. Eu gostaria de ver o código fonte com a chamada do método helper.carregaImagem(aluno.getCaminhoFoto()); funcionando dentro do ListView carregaLista(){ .... } postado aqui neste tópico.

Oi Antonio, tudo bem? Eu imaginei que salvar a foto já rotacionada resolvesse e não precisasse fazer isso sempre que fosse exibir a foto.

Você consegue me disponibilizar seu projeto para que eu dê uma testada e verifique mais de perto o que pode ser feito?

Claro professor.Neste link, eu disponibilizei ele: https://github.com/marquesprogramador/AgendaAlunos

O nome do arquivo é Agenda.rar.Dentro dele está o arquivo CarregadorDeFoto.java e também o arquivo FormularioHelper com as alterações no bitmap para rotacionar a foto. Se não conseguir baixar ou fazer alteração por fork, me avise pra que eu libere seu nome de usuário para vc acessa-lo.

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