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?

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.