Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

17
respostas

Erro ao pegar dados do servidor

Boa noite pessoal, blz? Então concluir o modulo, e me veio erro no insert do SqLite olhei no fórum fiz os procedimentos, só que eu conseguir contorna esse problema dando um clean e rebuild Project. Só que surgiu um outro problema no bitmap que não faço ideia do porque. Segue o erro: linha: at br.com.italo.agenda.adapter.AlunosAdapter.getView(AlunosAdapter.java:72)

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: br.com.italo.agenda, PID: 11691
                  java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference
                      at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:748)
                      at br.com.italo.agenda.adapter.AlunosAdapter.getView(AlunosAdapter.java:72/b)
                      at android.widget.AbsListView.obtainView(AbsListView.java:2934)
                      at android.widget.ListView.measureHeightOfChildren(ListView.java:1305)
                      at android.widget.ListView.onMeasure(ListView.java:1212)
                      at android.view.View.measure(View.java:20190)
                      at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:716)
                      at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:462)
                      at android.view.View.measure(View.java:20190)
                      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6330)
                      at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
                      at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139)
                      at android.view.View.measure(View.java:20190)
                      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6330)
                      at android.support.v7.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:400)
                      at android.view.View.measure(View.java:20190)
                      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6330)
                      at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
                      at android.view.View.measure(View.java:20190)
                      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6330)
                      at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
                      at android.widget.LinearLayout.measureVertical(LinearLayout.java:747)
                      at android.widget.LinearLayout.onMeasure(LinearLayout.java:629)
                      at android.view.View.measure(View.java:20190)
                      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6330)
                      at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
                      at com.android.internal.policy.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:3094)
                      at android.view.View.measure(View.java:20190)
                      at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2597)
                      at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:2303)
                      at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1440)
                      at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7421)
                      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:920)
                      at android.view.Choreographer.doCallbacks(Choreographer.java:695)
                      at android.view.Choreographer.doFrame(Choreographer.java:631)
                      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:906)
                      at android.os.Handler.handleCallback(Handler.java:739)
                      at android.os.Handler.dispatchMessage(Handler.java:95)
                      at android.os.Looper.loop(Looper.java:158)
                      at android.app.ActivityThread.main(ActivityThread.java:7230)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)
17 respostas

segue a Class:

package br.com.italo.agenda.adapter;

import android.content.Context;
import android.graphics.Bitmap;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.TextView;

import java.util.List;

import br.com.italo.agenda.ListaAlunosActivity;
import br.com.italo.agenda.R;
import br.com.italo.agenda.foto.CarregadorDeFoto;
import br.com.italo.agenda.modelo.Aluno;

/**
 * Created by italo on 05/02/2018.
 */

public class AlunosAdapter extends BaseAdapter {
    private final List<Aluno> alunos;
    private final Context context;

    public AlunosAdapter(Context context, List<Aluno> alunos) {
        this.context =context;
        this.alunos = alunos;
    }

    @Override
    public int getCount() {
        return alunos.size();
    }

    @Override
    public Object getItem(int position) {
        return alunos.get(position);
    }

    @Override
    public long getItemId(int position) {
        return 0;
    }

    @Override
    public View getView(int position, View convertView, ViewGroup parent) {
        Aluno aluno = alunos.get(position);

        LayoutInflater inflater = LayoutInflater.from(context);

        View view = convertView;
        if (view == null){
            view =inflater.inflate(R.layout.list_item,parent,false);
        }


        ImageView campoFoto = (ImageView) view.findViewById(R.id.item_foto);
        TextView campoNome = (TextView) view.findViewById(R.id.item_nome);
        TextView campoTelefone = (TextView) view.findViewById(R.id.item_telefone);
        TextView campoSite = (TextView) view.findViewById(R.id.item_site);
        TextView campoNota = (TextView) view.findViewById(R.id.item_nota);


            String caminhoFoto = aluno.getCaminhoFoto();
        if (caminhoFoto != null){
            //Bitmap bitmap = BitmapFactory.decodeFile(caminhoFoto);

            Bitmap bitmap1 = CarregadorDeFoto.carrega(caminhoFoto);

            Bitmap bitmapReduzido = Bitmap.createScaledBitmap(bitmap1,100,100,true);
            campoFoto.setImageBitmap(bitmapReduzido);
            campoFoto.setScaleType(ImageView.ScaleType.FIT_XY);
        }

        campoNome.setText(aluno.getNome());
        campoTelefone.setText( aluno.getTelefone());
        campoSite.setText( aluno.getSite());
        campoNota.setText("Nota: " + aluno.getNota().toString());

        return view;
    }
}

Tem o método carregadorDeFoto. Foi criado pois no J7 a foto fica no vertical. Segue o codigo:

package br.com.italo.agenda.foto;

import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.graphics.Matrix;
import android.media.ExifInterface;

import java.io.IOException;

/**
 * Created by italo on 04/02/2018.
 */

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);
        }
        return null;
    }

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


}

Fala ai Italo, de boa ?

Cara consegue confirmar se realmente está recebendo esse bitmap ?

Pois o erro que está dando é proveniente falando que não está.

Um outro detalhe que pode tentar é passar um tamanho fixo no lugar de usar o tamanho do bitmap :

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

Fala Matheus, blz? Então fiz esse teste ai deu certo.. tanto na hora de puxar o arquivo do servido quanto add. Só que estou com problema agora:

Bitmap bitmap1 = CarregadorDeFoto.carrega(caminhoFoto);
        //Aqui era pra fica visível ao usuário tamanho da foto;
            //Bitmap bitmapReduzido = Bitmap.createScaledBitmap(bitmap1,100,100,true);
            campoFoto.setImageBitmap(bitmap1);
            campoFoto.setScaleType(ImageView.ScaleType.FIT_XY);

Só que, como coloquei valor la na class rotação da foto, ela fica distorcida.

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

Tem alguma dica? Tentei manter o bitmap Reduzido só que da conflito.

Você pode criar um bitmap scaled, não sei se vai ajudar

Então e o que ta comentado, foi criado no inicio do curso de agenda.

    if (caminhoFoto != null){
            Bitmap bitmap1 = CarregadorDeFoto.carrega(caminhoFoto);
            Bitmap bitmapReduzido = Bitmap.createScaledBitmap(bitmap1,100,100,true);
            campoFoto.setImageBitmap(bitmapReduzido);
            campoFoto.setScaleType(ImageView.ScaleType.FIT_XY);
        }

quando ativo ele aparece erro:

E/AndroidRuntime: FATAL EXCEPTION: main
                  Process: br.com.italo.agenda, PID: 28496
                  java.lang.NullPointerException: Attempt to invoke virtual method 'int android.graphics.Bitmap.getWidth()' on a null object reference
                      at android.graphics.Bitmap.createScaledBitmap(Bitmap.java:748)
                      at br.com.italo.agenda.adapter.AlunosAdapter.getView(AlunosAdapter.java:71)
                      at android.widget.AbsListView.obtainView(AbsListView.java:2934)
                      at android.widget.ListView.measureHeightOfChildren(ListView.java:1305)
                      at android.widget.ListView.onMeasure(ListView.java:1212)
                      at android.view.View.measure(View.java:20190)
                      at android.widget.RelativeLayout.measureChildHorizontal(RelativeLayout.java:716)
                      at android.widget.RelativeLayout.onMeasure(RelativeLayout.java:462)
                      at android.view.View.measure(View.java:20190)
                      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6330)
                      at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
                      at android.support.v7.widget.ContentFrameLayout.onMeasure(ContentFrameLayout.java:139)
                      at android.view.View.measure(View.java:20190)
                      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6330)
                      at android.support.v7.widget.ActionBarOverlayLayout.onMeasure(ActionBarOverlayLayout.java:400)
                      at android.view.View.measure(View.java:20190)
                      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6330)
                      at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
                      at android.view.View.measure(View.java:20190)
                      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6330)
                      at android.widget.LinearLayout.measureChildBeforeLayout(LinearLayout.java:1464)
                      at android.widget.LinearLayout.measureVertical(LinearLayout.java:747)
                      at android.widget.LinearLayout.onMeasure(LinearLayout.java:629)
                      at android.view.View.measure(View.java:20190)
                      at android.view.ViewGroup.measureChildWithMargins(ViewGroup.java:6330)
                      at android.widget.FrameLayout.onMeasure(FrameLayout.java:194)
                      at com.android.internal.policy.PhoneWindow$DecorView.onMeasure(PhoneWindow.java:3094)
                      at android.view.View.measure(View.java:20190)
                      at android.view.ViewRootImpl.performMeasure(ViewRootImpl.java:2597)
                      at android.view.ViewRootImpl.measureHierarchy(ViewRootImpl.java:1552)
                      at android.view.ViewRootImpl.performTraversals(ViewRootImpl.java:1844)
                      at android.view.ViewRootImpl.doTraversal(ViewRootImpl.java:1440)
                      at android.view.ViewRootImpl$TraversalRunnable.run(ViewRootImpl.java:7421)
                      at android.view.Choreographer$CallbackRecord.run(Choreographer.java:920)
                      at android.view.Choreographer.doCallbacks(Choreographer.java:695)
                      at android.view.Choreographer.doFrame(Choreographer.java:631)
                      at android.view.Choreographer$FrameDisplayEventReceiver.run(Choreographer.java:906)
                      at android.os.Handler.handleCallback(Handler.java:739)
                      at android.os.Handler.dispatchMessage(Handler.java:95)
                      at android.os.Looper.loop(Looper.java:158)
                      at android.app.ActivityThread.main(ActivityThread.java:7230)
                      at java.lang.reflect.Method.invoke(Native Method)
                      at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:1230)
                      at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:1120)

Se não me falhe a memoria e o mesmo erro do inicio do post

Seu carregador voltou a ter o mesmo código que havia antes ?

Sim, quando createScaledBitmap e add no codigo

posso mandar link do projeto pelo drive e você da uma olhada?

manda o github, fica melhor kkk

Desculpa demora tive problema com git aqui na maquina: https://github.com/AstonCreat/Agenda

vou dar uma olhadinha e te dou um feedback depois :D

Bizarramente consegui fazer seu código funcionar sem levar esse exception...

Bom dia Matheus, só baixou executo de primeira?

sim sim

fez o teste do cadastro com foto, e depois apagou app e tentou pega do servidor?