4
respostas

Rotaciona a foto mas não salva a alteração na lista.

Olá Alessandro Lima Alexandre.Obrigado por ajudar no outro tópico.O código que vc passou funciona para rotacionar a foto no formulário, mas infelizmente só funciona parcialmente.Quando clicamos no botão de tirar a foto, 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.Aí está o código da 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*/
    }
}

E só mais uma última coisa.Quando vou editar o aluno ou conferir os dados, a foto no formulário está rotacionada do jeito correto, exatamente do jeito que tiramos.É somente na lista que as fotos miniaturizadas ficam invertidas de novo.

4 respostas

Ola, tudo bom Antônio

Da forma que implementamos, sempre que quiser usar a imagem, vai precisar criar um bitmap e rotacionar ele a partir da foto original.

Você está chamando este método no adapter da lista? Se não estiver, faça isso antes de inserir a imagem no Imageview

Faça este teste e posta aqui o resultado, sei que esta não é a melhor solução, se quiser podemos melhorar essa Implementação

Ahh, legal que consegui te ajudar no outro tópico, não esquece de marcar ele como solucionado

Abç

Estou chamando a partir da Classe FormularioHelper:

package br.com.alura.schedule;

import android.graphics.Bitmap; import android.graphics.BitmapFactory; import android.graphics.Matrix; import android.media.ExifInterface; import android.widget.EditText; import android.widget.ImageView; import android.widget.RatingBar;

import java.io.IOException;

import br.com.alura.schedule.modelo.Aluno;

/**

  • Created by Thanatos on 03/12/2018. */

public class FormularioHelper {

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

public FormularioHelper(FormularioActivity activity) {
    campoNome = (EditText) activity.findViewById(R.id.formulario_nome);
    campoEndereco = (EditText) activity.findViewById(R.id.formulario_endereco);
    campoTelefone = (EditText) activity.findViewById(R.id.formulario_telefone);
    campoSite = (EditText) activity.findViewById(R.id.formulario_site);
    campoNota = (RatingBar) activity.findViewById(R.id.formulario_nota);
    campoFoto = activity.findViewById(R.id.formulario_foto);
    aluno = new Aluno();
}

...

public void carregaImagem(String caminhoFoto) {

    if (caminhoFoto !=null){
            //CODIGO ANTIGO, ANTES DE USAR A CLASSE CarregadorDeFoto
            /*Bitmap bitmap = BitmapFactory.decodeFile(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 */
            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*/
    }
}

Neste caso, terei que adaptar o código para chamar o CarregadorDeFoto.carrega(caminhoFoto) a partir do ListaAlunosActivity, foi assim que vc fez no seu?

Olá Antonio

Eu deixei toda a lógica de carregamento da imagem, em uma classe "útil", com métodos estáticos. Assim sempre que eu precisava carregar a imagem, era só chamar um dos método estático para, carregar a imagem, carregar e rotacionando, etc

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