3
respostas

Problema não resolvido.Preciso de ajuda com a foto.

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);

} }

3 respostas

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 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)???

Para facilitar mais as coisas, eu disponibilizei o projeto aqui: 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.

Oi Antonio, tudo bem? O Jefferson, que gravou cursos de Android escreveu um artigo bem legal de como fazer essa correção, você já deu uma olhada?

Link: https://www.alura.com.br/artigos/como-corrigir-a-orientacao-das-fotos-no-android

Qualquer coisa, estamos aqui, posso ver seu projeto logo mais.