Skip to content
marloncarvalho edited this page Aug 8, 2012 · 5 revisions

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.

Map

Onde encontrar o código?

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!

Referências

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.

Como funciona?

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).

Como utilizar?

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.