-
Notifications
You must be signed in to change notification settings - Fork 14
Geolocalização
Nós utilizamos a geolocalização para obter as coordenadas do usuário, enviar para o servidor e depois obter elas para exibir em um Mapa. Você encontra esta opção na tela onde se encontra o Ranking de usuários. No canto inferior direito há um ícone! Clique nele para ver. A tela é igual a esta logo abaixo.
A classe que obtém a localização geográfica do usuário é a LoginActivity.java. Ela se encontra no pacote br.gov.serpro.equizmo.view.activity. Você encontra o código específico para isto no método setListeners, que veremos logo logo!
Sugerimos fortemente que você leia o Guia oficial do Android no tópico sobre este assunto. Lá tem dicas das estratégias que você pode usar para obter as coordenadas do usuário. Para chegar lá, acesse o link http://developer.android.com/guide/topics/location/strategies.html.
O funcionamento é bastante simples. Primeiro, tentamos checar se o dispositivo não tem guardada a última localização do usuário. Deste jeito, o GPS ou a Rede sequer serão ligados. Caso não tenha uma última localização registrada, partimos para tentar obter ela a partir do GPS ou da Rede (Wifi ou 3G).
Todo o código responsável pela obtenção das coordenadas está logo abaixo. Vamos analisar ele com mais cuidado!
private void setListeners() {
buttonEnter.setOnClickListener(new OnClickListener() {
public void onClick(final View v) {
boxAlert.setVisibility(View.VISIBLE);
buttonEnter.setClickable(false);
buttonEnter.setEnabled(false);
final Location lastLocation = locationManager.getLastKnownLocation(LocationManager.NETWORK_PROVIDER);
final User user = new User();
user.name = editTextName.getText().toString();
user.email = editTextEmail.getText().toString();
if (lastLocation.getLatitude() == 0 && lastLocation.getLongitude() == 0) {
locationListener = new LocationListener() {
public void onLocationChanged(Location location) {
user.latitude = location.getLatitude();
user.longitude = location.getLongitude();
execute(user);
locationManager.removeUpdates(locationListener);
}
public void onStatusChanged(String provider, int status, Bundle extras) {
}
public void onProviderEnabled(String provider) {
}
public void onProviderDisabled(String provider) {
}
};
locationManager.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 0, 0, locationListener);
locationManager.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0, locationListener);
} else {
user.latitude = lastLocation.getLatitude();
user.longitude = lastLocation.getLongitude();
execute(user);
}
}
});
}
Observe que há um listener no botão para entrar na aplicação. Neste momento, vamos obter o Nome e E-mail digitados pelo usuário, assim como sua localização. Criamos um LocationListener e o registramos no LocationManager. Com este registro, estamos dizendo que esse Listener será avisado sempre que houver uma mudança na localização do usuário.
Mas perceba que não precisamos monitorar constantemente a localização do usuário, afinal de contas, nossa aplicação não é um Navegador de Mapas! :) Portanto, assim que obtemos a localização, nós "desregistramos" nosso Listener do LocationManager para que o GPS/Rede não seja mais usado. Isso vai poupar a bateria do usuário do eQuizmo!
O método onLocationChanged(Location location) da classe Listener é que será chamado assim que houver uma mudança na localização do usuário.