Solucionado (ver solução)
Solucionado
(ver solução)
11
respostas

PROBLEMA no CURSO!?

Olá equipe Alura e todos estudantes do curso Android, na ultima aula do curso que se trata de GPS temos um empecilho, a classe LocationClient usada no curso não está mais disponível na nova atualização do play services. Alguém tem maiores informações de um TUTO ou algo para continuar os estudos?

Matricule-se agora e aproveite até 50% OFF

O maior desconto do ano para você evoluir com a maior escola de tecnologia

QUERO APROVEITAR
11 respostas

Olá Pessoal estou com o mesmo problema.

Links que me ajudaram a ajustar os exercicios ao novo GoogleApiClient no lugar do LoctionClient

http://stackoverflow.com/questions/24611977/android-locationclient-class-is-deprecated-but-used-in-documentation

http://developer.android.com/training/location/receive-location-updates.html

Exemplo do meu exercicio:

public AtualizadorDeLocalizacao(Context ctx, MapaFragment mapa) { this.mapa = mapa; Configurador configurador = new Configurador(this); client = new GoogleApiClient.Builder(ctx) .addApi(LocationServices.API) .addConnectionCallbacks(configurador) .build(); client.connect(); }

Christian, vlw pela dica. só não vou marcar como solução pois estou aguardando alguma resposta do Alura.

Vc Está certo, Thiago. Eles precisam atualizar o material do curso. Bons estudos!!!

Que bacana! Também tive problemas com isto e fiz conforme as indicações que encontrei na internet, link: http://stackoverflow.com/questions/27365766/locationclient-class-not-found-on-google-play-services-rev-22. Mas também espero que seja atualizado o curso.

Aproveitando o tópico, gostaria de perguntar o que acharam da maneira com que foi implementada a Lista principal, dos Alunos cadastros, vi que ela fica travando a medida que acontece um Scroll, sei que existe uma outra forma de implementa fazendo que o Scroll flua sem esses travamentos, só não achei muito legal o pessoal já não ter demonstrado como fazer já da maneira que não causa estes travamentos... Espero que atualizem isto também no curso.

Flw galera, bons estudos!!

É verdade Adriano, trava mesmo. qual é essa maneira de implementar que não trava? pode deixar um exemplo aqui ? é com o onScrolListener ? fala mais xD

Opaa!!! Descupe a demora, não havia visto que tinha uma resposta no tópico :D Para que não aconteça essas pequenas travadas, tem que fazer de um jeito que "recicle" as views que estão visíveis na tela, ou seja, se na tela cabem apenas 5 itens, ao fazer o scroll para visualizar os próximos 5, você utiliza as mesmas views utilizadas para os primeiros 5 itens. Fiz um outro curso uma vez que foi ensinado fazer desta maneira, por isto que comentei sobre isto no curso do Alura.

Bom, mas enfim, encontrei o seguinte tutorial que ensina como fazer do jeito que comentei.

http://www.binpress.com/tutorial/smooth-out-your-listviews-with-a-viewholder/9

solução!

Boa noite pessoal, as vezes eu acho que a caelum faz de propósito pra o aluno andar com as próprias pernas :) Segue um exemplo do uso da nova API:

http://stackoverflow.com/questions/24611977/android-locationclient-class-is-deprecated-but-used-in-documentation

E como ficou Minha Implementação:

AtualizadorDeLocalizacao :

package br.com.caelum.util;

import android.content.Context;
import android.location.Location;
import android.os.Bundle;
import android.util.Log;

import com.google.android.gms.common.ConnectionResult;
import com.google.android.gms.common.api.GoogleApiClient;
import com.google.android.gms.location.LocationListener;
import com.google.android.gms.location.LocationRequest;
import com.google.android.gms.location.LocationServices;
import com.google.android.gms.maps.model.LatLng;

import java.util.logging.Logger;

import br.com.caelum.fragment.MapaFragment;

/**
 * Created by JOAO on 19/02/2015.
 */
public class AtualizadorDeLocalizacao implements GoogleApiClient.ConnectionCallbacks,
        GoogleApiClient.OnConnectionFailedListener, LocationListener{

    private final String TAG = "LogLocalizacao";
    private GoogleApiClient cliente;
    private LocationRequest locationRequest;
    private MapaFragment mapa;

    public AtualizadorDeLocalizacao(Context context, MapaFragment mapa) {
        this.mapa = mapa;
        this.cliente = new GoogleApiClient.Builder(context).addApi(LocationServices.API)
                .addConnectionCallbacks(this)
                .addOnConnectionFailedListener(this)
                .build();
        cliente.connect();
    }

    @Override
    public void onConnected(Bundle bundle) {
        locationRequest = LocationRequest.create();
        locationRequest.setPriority(LocationRequest.PRIORITY_HIGH_ACCURACY);
        locationRequest.setInterval(1000);

        LocationServices.FusedLocationApi.requestLocationUpdates(cliente, locationRequest, this);
    }

    @Override
    public void onConnectionSuspended(int i) {
        Log.i(TAG, "A conexão foi suspensa");
    }

    @Override
    public void onConnectionFailed(ConnectionResult connectionResult) {
        Log.i(TAG, "Falha na conexão");
    }

    @Override
    public void onLocationChanged(Location location) {
        double latitude = location.getLatitude();
        double longitude = location.getLongitude();

        LatLng novoLocal = new LatLng(latitude, longitude);

        mapa.centralizaNo(novoLocal);
    }

MapaFragment:

public class MapaFragment extends SupportMapFragment{ 

    @Override
    public void onResume() {
        super.onResume();

        Localizador localizador = new Localizador(getActivity());
        new AtualizadorDeLocalizacao(getActivity(), this);

        AlunoDAO dao = new AlunoDAO(getActivity());
        List<Aluno> alunos = dao.getLista();
        dao.close();

        for (Aluno aluno : alunos){
            LatLng coordenada = localizador.getCoordenada(aluno.getEndereco());
            if(coordenada != null){
                MarkerOptions marcador = new MarkerOptions().position(coordenada)
                        .title(aluno.getNome()).snippet(aluno.getEndereco());

                getMap().addMarker(marcador);
            }
        }

    }

    public void centralizaNo(LatLng local){
        GoogleMap mapa = getMap();
        mapa.moveCamera(CameraUpdateFactory.newLatLngZoom(local, 17));
    }
}

Olá pessoal,

@Thiago, de fato, na última atualização do Google Play Services a classe LocationClient virou GoogleApiClient e em vez de fazer:

client.requestLocationUpdates...

agora fazemos:

LocationServices.FusedLocationApi.requestLocationUpdates...

O código com as mudanças é exatamente a sugestão do @João.

@Adriano: sobre a lentidão da listView, isso ocorre pois estamos sempre redimensionando o bitmap da foto para cada item criado (que possui foto). Perceba que salvamos a imagem no tamanho grande gerado pela câmera e a diminuimos no getView do AlunosAdapter.

A prática de reciclagem do item melhora a velocidade de exibição de uma listView, pois diminui o número de chamadas ao método inflate. Sempre que esse método é chamado, o Android tem que ler o XML do seu item e isso demora um pouquinho.

Porém, neste caso reciclar o item não ajudaria tanto, pois o scale da imagem é muito mais custoso do que percorrer um XML.

Sobre otimização em listView olhem o "padrão" ViewHolder sugerido pela própria documentação do Android.

Abraços e bons estudos a todos!

@FELIPE cara, implementei o view holder na aplicação, e não surtiu melhora no travamento, pode me dizer o que faltou, ou onde estou errando?

  @Override
    public View getView(int position, View convertView, ViewGroup parent) {


         View linha = convertView;
        ViewHolder holder = null;

        if(linha == null){
            linha = inflater.inflate(R.layout.item,parent,false);
            holder = new ViewHolder();
            holder.ivImagem = (ImageView) linha.findViewById(R.id.foto);
            holder.tvNome = (TextView) linha.findViewById(R.id.nome);
            holder.tvSite = (TextView) linha.findViewById(R.id.site);
            holder.tvTel = (TextView) linha.findViewById(R.id.telefone);
            linha.setTag(holder);
        }
        else{
            holder = (ViewHolder) linha.getTag();
        }

        Aluno aluno = (Aluno) getItem(position);

       holder.tvNome.setText(aluno.getNome());
        if (aluno.getCaminhoFoto() != null) {
            Bitmap imagem = BitmapFactory.decodeFile(aluno.getCaminhoFoto());
            Bitmap imagemReduzida = Bitmap.createScaledBitmap(imagem, 100, 100, false);
            holder.ivImagem.setImageBitmap(imagemReduzida);
        } else {
            holder.ivImagem.setImageResource(R.drawable.ic_no_image);
        }

        if (position % 2 == 0) {
            linha.setBackgroundColor(activity.getResources().
                    getColor(R.color.linha_par));
        }

        if(holder.tvTel != null){
            holder.tvTel.setText(aluno.getTelefone());
            holder.tvSite.setText(aluno.getSite());
        }
        return linha;
    }
}

Thiago, sua implementação está correta, porém para esse caso não surtirá efeito na ListView, pois o que faz ela demorar é o redimensionamento das fotos dos alunos.