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