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

Estou com dúvida no curso de Android : Integração com o servidor e Mapas - Parte 3, no exercício do capítulo Interagindo com o GPS.

Apesar de ter feito tudo conforme foi explicado, o mapa não está centralizando. Debuguei o código e o método onLocationChanged não é executado.....

public class AtualizadorDePosicao implements LocationListener {

    private LocationManager locationManager;
    private MapaFragment mapa;

    public AtualizadorDePosicao(Activity activity, MapaFragment mapa){
        this.mapa = mapa;
        locationManager = (LocationManager) activity.getSystemService(Context.LOCATION_SERVICE);//Retorna Serviço de localização
        //Parâmetro 1 - Provider: Utilizado pelo LocationManager para determinar a posição
        //Parâmetro 2 - MinTime: Tempo mínimo para fazer uma nova leitura da posição
        //Parâmetro 3 - minDistance: Distância mínima para fazer uma nova leitura da posição
        //Parâmetro 4 - Listener: Fica atento a mudança de localização
        String provider = locationManager.GPS_PROVIDER; //Informa a utilização do GPS
        long tempoMinimo = 2000;//2segundos
        float distanciaMinima = 20;//20m
        locationManager.requestLocationUpdates(provider, tempoMinimo, distanciaMinima, this);
    }

    public void cancelar() {
        locationManager.removeUpdates(this);
    }

    //Informa quando a posição mudou
    @Override
    public void onLocationChanged(Location novaLocalizacao) {
        //Tem que converter o location para LatLng
        double latitude = novaLocalizacao.getLatitude();
        double longitude = novaLocalizacao.getLongitude();

        LatLng local = new LatLng(latitude, longitude);
        mapa.centralizaNoLocal(local);
    }

    //Utilizar outra forma de localização
    @Override
    public void onProviderDisabled(String provider) {
    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
    }

    @Override
    public void onProviderEnabled(String provider) {
    }
}
7 respostas

Ricardo, poderia postar o código que instancia o AtualizadorDePosicao e o usa por favor? Aqui o codigo parece ok

Estou chamando na Activity MostraAlunosProximos

package br.com.caelum.cadastro;

import com.google.android.gms.maps.SupportMapFragment;
import br.com.caelum.cadastro.fragment.MapaFragment;
import br.com.caelum.cadastro.mapa.AtualizadorDePosicao;
import android.content.Context;
import android.location.LocationManager;
import android.os.Bundle;
import android.support.v4.app.FragmentActivity;
import android.support.v4.app.FragmentManager;
import android.support.v4.app.FragmentTransaction;

public class MostraAlunosProximos extends FragmentActivity {

    private AtualizadorDePosicao atualizadorDePosicao;

    @Override
    public void onCreate(Bundle arg0) {
        super.onCreate(arg0);
        setContentView(R.layout.mapa_layout);

        FragmentManager manager = getSupportFragmentManager();
        FragmentTransaction transaction = manager.beginTransaction();
        MapaFragment mapaFragment = new MapaFragment();
        transaction.replace(R.id.mapa, mapaFragment);
        transaction.commit();

        atualizadorDePosicao = new AtualizadorDePosicao(this, mapaFragment);
    }

    @Override
    protected void onDestroy() {
        super.onDestroy();
        atualizadorDePosicao.cancelar();
    }

}
solução!

Para centralizar o mapa de acordo com a sua posição atual, temos que alterar o próprio MapaFragment. Atualmente, onResume do MapaFragment deve estar assim:

public class MapaFragment extends SupportMapFragment{
    @Override
    public void onResume() {
        super.onResume();

        Localizador localizador = new Localizador(getActivity());
        LatLng local = localizador.getCoordenada("Rua Vergueiro 3185 Vila Mariana");

        this.centralizaNo(local);
}

Perceba que sempre que o MapaFragment for renderizado na tela, ele tentará se centralizar no local fixo. Então, em vez de fazer essa centralização fixa, vamos utilizar nosso AtualizadorDePosicao criado anteriormente.

Vamos, no onResume, instanciar o AtualizadorDePosicao passando a activity (getActivity()) e o MapaFragment (this), dessa forma o MapaFragment estará centralizado de acordo com o GPS:

public class MapaFragment extends SupportMapFragment{
    @Override
    public void onResume() {
        super.onResume();

        new AtualizadorDePosicao(getActivity(), this);
}

Obrigado! Sugiro uma revisão na vídeo aula.

Bom dia Ricardo!

Estamos com a revisão dos vídeos do curso em andamento! De tempo em tempo fazemos para atualizar versões.

obrigado

Boa Tarde, eu fiz tudo de acordo com o que disseram, só que o meu ainda não centraliza.. Segue os códigos

public class AtualizadorDeLocalizacao implements LocationListener{



    private LocationManager manager;
    private MapaFragment mapa;


    public AtualizadorDeLocalizacao(Activity activity, MapaFragment mapa) {

        this.mapa = mapa;
        manager = (LocationManager) activity.getSystemService(Context.LOCATION_SERVICE);

        int distanciaMinima = 20;
        int tempoMinimo = 20000;

        manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, tempoMinimo, distanciaMinima, this);

    }

    public void cancela() {
        manager.removeUpdates(this);
    }

    @Override
    public void onLocationChanged(Location location) {

        double latitude = location.getLatitude();
        double longitude = location.getLongitude();

        LatLng local = new LatLng(latitude, longitude);
        mapa.centralizaNo(local);


    }

    @Override
    public void onProviderDisabled(String provider) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onProviderEnabled(String provider) {
        // TODO Auto-generated method stub

    }

    @Override
    public void onStatusChanged(String provider, int status, Bundle extras) {
        // TODO Auto-generated method stub

    }

}
public class MostraAlunosProximosActivity extends FragmentActivity{

    private AtualizadorDeLocalizacao atualizadorDeLocalizacao;

    @Override
    protected void onCreate(Bundle bundle) {

        super.onCreate(bundle);
        setContentView(R.layout.map_layout);

        MapaFragment mapaFragment = new MapaFragment();

        FragmentTransaction transaction = getSupportFragmentManager().beginTransaction();
        transaction.replace(R.id.mapa, mapaFragment);
        transaction.commit();

        atualizadorDeLocalizacao = new AtualizadorDeLocalizacao(this, mapaFragment);
    }

    @Override
    protected void onDestroy() {
        // TODO Auto-generated method stub
        super.onDestroy();
        atualizadorDeLocalizacao.cancela();
    }

}
@Override
    public void onResume() {
        // TODO Auto-generated method stub
        super.onResume();


        FragmentActivity context = getActivity();

        new AtualizadorDeLocalizacao(context, this);

        AlunoDao alunoDao = new AlunoDao(getActivity());
        List<Aluno> alunos = alunoDao.getLista();
        alunoDao.closeHelper();

        for (Aluno aluno : alunos) {

            Localizador localizador = new Localizador(context);
            LatLng coordenada = localizador.getCoordenada(aluno.getEndereco());

            if(coordenada != null)
            {
                 MarkerOptions marcador = new MarkerOptions();
                 marcador.position(coordenada);
                 marcador.title(aluno.getNome());
                 marcador.snippet(aluno.getEndereco());


                 getMap().addMarker(marcador);
            }


        }


    }

    public void centralizaNo(LatLng local) {

        GoogleMap map = this.getMap();

        map.moveCamera(CameraUpdateFactory.newLatLngZoom(local, 17));

    }
}

Oi Jéssica,

olhando seu código, parece estar tudo certo. Talvez seja o GPS que esteja com dificuldades para encontrar a sua localização. Em vez de usar o GPS, tente alterar para buscar a localização de acordo com o WiFi:

Na classe AtualizadorDeLocalizacao, onde você faz:

manager.requestLocationUpdates(LocationManager.GPS_PROVIDER, tempoMinimo, distanciaMinima, this);

Altere para:

manager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, tempoMinimo, distanciaMinima, this);

Veja se isso resolve o seu problema.

Abraço e bons estudos.