Vous êtes sur la page 1sur 9

Curso PUDE

Desarrollo de Aplicaciones Mviles en Android

Ejercicio Intermedio D: Localizacin por GPS

A. Descripcin
En este ejercicio, introduciremos cmo funcionan los servicios de localizacin en Android y explicaremos cmo conseguir que la API deAndroid nos indique nuestraposicin GPS. Para ello crearemos una aplicacin muy sencilla que activa y desactiva el receptor GPS del dispositivo Android, devolviendo la posicin al usuario. En Android, tenemos dos paquetes de servicios relacionados con la geolocalizacin, el mapa y la posicin. Veremos cmo obtener nuestra posicin de forma sencilla y rpida. Hay dos posibles fuentes de informacin sobre nuestra posicin, el receptor GPS del dispositivo o la red, y por red nos referimos a la red que est utilizando el dispositivo para conectarse a internet. As, el dispositivo nos puede devolver nuestra posicin en base a qu antenas de telefona mvil est utilizando, triangulando la posicin, o si estamos utilizando un hotspotWi-Fi cuya posicin es conocida, obtenerla. En cualquier caso, cada mtodo tiene sus ventajas y sus desventajas, y aunque en un principio el GPS siempre parece el mejor, no suele funcionar bien en interiores, y un uso excesivo drena mucho la batera, cosa que como programadores debemos siempre tener en cuenta, y asegurarnos de que nuestras aplicaciones cuiden de la batera lo mximo posible.

B. Implementacin B-1. Interfaz


Para empezar, debemos crear un nuevo proyecto NOTA: MAPS GOOGLE (al final del enunciado) y aadirle al Layout dos nuevos TextView, uno para mostrar la longitud y otro para la latitud. Justo debajo, aadiremos un ToggleButton, que es un botn con una peculiaridad: posee dos estados. Puede estar activado (el mtodo isChecked() retorna true) o desactivado (isChecked() retorna false). Lo utilizaremos para activar y desactivar el GPS. Como el ToggleButton tiene dos estados, puede llevar dos etiquetas distintas, una para cada estado. El atributo para la etiqueta cuando est desactivado es

Desarrollo de Aplicaciones Mviles en Android Ejercicio Intermedio D: Localizacin por GPS Autores: Jorge Carballo Franquis David D. HarjaniHarjani

Pgina 1 de 9

textOff y para cuando est activado textOn. Naturalmente, a los dos TextView y al

ToggleButton debemos asignarles una ID. Ahora pasamos a la actividad. Empezamos aadiendo un mtodo privado llamado initConfig() al que llamaremos en el constructor. Luego aadimos tres variables privadas a la actividad, dos TextView y un ToggleButton, y aadimos el cdigo necesario en initConfig() para que estas variables hagan referencia a las vistas del main.xml.

B-2. La API de Localizacin


Antes de poder escribir cdigo en el que solicitamos informacin al sistema operativo de nuestra posicin (lo cual requiere activar las funciones de GPS), necesitamos que nuestra aplicacin tenga los permisos necesarios, o Android nos cerrar la aplicacin. Esto lo hacemos acudiendo al manifest, y aadiendo estas dos lneas al final, justo antes de que se cierre el tagmanifest:

<usespermissionandroid:name="android.permission.ACCESS_FINE_LOCATION"></use s-permission> <usespermissionandroid:name="android.permission.ACCESS_COARSE_LOCATION"></u ses-permission>

Estos permisos nos permiten obtener informacin directa del chip GPS (ACCESS_FINE_LOCATION) o de la red (ACCESS_COARSE_LOCATION ). A partir de ahora todo el cdigo es Java, as que volvemos a nuestra nica actividad, y le aadimos stas variables:

privateLocationManagerlocMgr; privateLocationListeneronLocationChange;

La primera variable, de tipo LocationManager, es la que nos permite tener acceso a objetos de la clase Location, que son los que nos darn las coordenadas de longitud y latitud que queremos. Como sabemos, la API de Android se basa mucho en el patrn de diseo Observador, y esto tambin se extiende a la API de localizacin. Lo que queremos mostrar en nuestra aplicacin es siempre la ltima posicin que obtiene el dispositivo a travs del receptor, por lo que tenemos que registrarnos como observador, y eso lo hacemos a travs del LocationListener.

Desarrollo de Aplicaciones Mviles en Android Ejercicio Intermedio D: Localizacin por GPS Autores: Jorge Carballo Franquis David D. HarjaniHarjani

Pgina 2 de 9

Volvamos al initConfig(). Tras inicializar los TextView y el ToggleButton, inicializaremos el LocationManager y el LocationListener, con este cdigo:

locMgr = (LocationManager) getSystemService(Context.LOCATION_SERVICE); onLocationChange = newLocationListener() { @Override publicvoidonLocationChanged(android.location.Location location) { longitutdeTextView.setText("Longitud: " + location.getLongitude()); latitudeTextView.setText("Latitud: " + location.getLatitude()); Log.i(LOG_TAG, "Received Location update."); } @Override publicvoidonProviderDisabled(String provider) { Log.i(LOG_TAG, "Location provider " + provider + " has been disabled."); } @Override publicvoidonProviderEnabled(String provider) { Log.i(LOG_TAG, "Location provider " + provider + " has been enabled."); } @Override publicvoidonStatusChanged(String provider, int status, Bundle extras) { Log.i(LOG_TAG, "Location provider " + provider + " has changed status to " + status); } };
NOTA: Suponemos que el alumno ya est familiarizado con el uso del LogCat y de sus funciones.

No podemos crear una nueva instancia de LocationManager, sino que debemos pedrselo al sistema, y eso lo hacemos mediante la llamada getSystemService(). Luego inicializamos el LocationListener, que actuar cuando lo registremos. La llamada onLocationChanged() se produce cuando el dispositivo consigue un nuevo dato sobre nuestra posicin, el onProviderDisabled() es llamado cuando pedimos que Android nos d informacin de localizacin de un proveedor que est deshabilitado por el usuario (por ejemplo, el GPS est desactivado), y lo contrario en el caso del onProviderEnabled(). El ltimo mtodo, onStatusChanged(), es llamado cuando hay cambios respecto al proveedor de servicio de localizacin, por ejemplo, al volverse no disponible, al volver a estar disponible, etc. A veces tambin provee de informacin extra en el Bundle, como el nmero de satlites utilizados para obtener la posicin GPS. Podemos ver que, en el mtodo que ms nos interesa, el onLocationChanged(), actualizamos el texto que se muestra en los TextView con la localizacin de la que nos

Desarrollo de Aplicaciones Mviles en Android Ejercicio Intermedio D: Localizacin por GPS Autores: Jorge Carballo Franquis David D. HarjaniHarjani

Pgina 3 de 9

provee Android. El objeto Location provee de ms informacin, y animamos a los alumnos a indagar un poco y a descubrir qu ms nos puede ofrecer. Ahora tenemos el segmento de cdigo ms importante, el del ToggleButton. Lo que queremos es que cuando el usuario active el botn, registremos nuestro LocationListener con el proveedor del servicio de localizacin por GPS para que nos avise en cuanto tenga una nueva posicin (es decir, que llame a los mtodos correspondientes de onLocationChange), y que cuando desactivemos el botn, dejemos de solicitar posiciones por GPS para ahorrar batera. Si nosotros ramos los nicos solicitando informacin GPS, Android desactivar el chip automticamente al decirle que ya no queremos ms informacin sobre nuestra posicin. Dado que todos somos humanos, tenemos que programar para el peor caso. Qu ocurre si el usuario pulsa el botn Atrs sin haber vuelto a tocar el ToggleButton para decirle a Android que deje de solicitar informacin por GPS?Android mantendr el chip GPS activo pensando que hay una aplicacin solicitando informacin, y dado que an estamos registrados en el listener, Android no podr liberar la memoria de nuestra aplicacin, drenando la batera hasta que logremos matar el proceso o apaguemos el telfono. Debemos ser muy precavidos con esto. ste es el cdigo del ToggleButton, que ponemos al final del initConfig():

toggleButton.setOnClickListener(newView.OnClickListener() { @Override publicvoidonClick(View v) { if (toggleButton.isChecked()){ locMgr.requestLocationUpdates(LocationManager.GPS_PROVIDER, 0, 0f, onLocationChange); } else { locMgr.removeUpdates(onLocationChange); } } });

NOTA: A partir de este cdigo, los alumnos deben ser capaces de aadir a la actividad el mtodo onDestroy() con las llamadas necesarias, la de la clase padre y la que informa al sistema operativo que ya no queremos ms informacin de localizacin.

En el onClick(), estamos registrando nuestro LocationListener (onLocationChange) para recibir informacin sobre nuestra posicin GPS. En vez de utilizar el GPS, tambin podramos haber utilizado la red (de telefona o Wi-Fi, eso lo decide Android) cambiando el primer argumento porLocationManager.NETWORK_PROVIDER. En el
Desarrollo de Aplicaciones Mviles en Android Ejercicio Intermedio D: Localizacin por GPS Autores: Jorge Carballo Franquis David D. HarjaniHarjani

Pgina 4 de 9

ltimo argumento le decimos cul es nuestro LocationListener asociado a la peticin, y luego quedan el segundo y el tercer argumento, los relacionados directamente con el gasto de la batera. El segundo argumento es el tiempo mnimo, en milisegundos, que debe pasar antes de que Android vuelva a solicitar nuestra posicin GPS. Por ejemplo, un valor de 10000 significara que como poco, pasarn diez segundos entre peticin y peticin. El tercer argumento es la distancia mnima, en metros, entre peticin y peticin. Nosotros hemos solicitado que Android nos diga nuestra posicin lo antes posible, sin descanso, prcticamente en tiempo real, lo cual es la configuracin que ms consume la batera. No se recomienda realizar peticiones con intervalo inferior a 1 minuto en aplicaciones de uso diario. Por supuesto, hay excepciones; por ejemplo, en un navegador GPS para el coche, se presupone que el usuario comprar el adaptador para darle corriente al dispositivo Android, ya que lo que prima en este caso de uso es la fiabilidad de la informacin al conducir y no el consumo energtico. Por ltimo, queremos mostrar un dato al usuario para empezar, el de la ltima posicin conocida por el sistema, sea de GPS o de la red. Esto lo haremos con el siguiente cdigo, que ya cierra el mtodo initConfig():

android.location.Location location = locMgr.getLastKnownLocation(LocationManager.GPS_PROVIDER); if (location == null) location = locMgr.getLastKnownLocation(LocationManager.NETWORK_PROVIDER); if (location != null) { longitutdeTextView.setText("Longitud: " + location.getLongitude()); latitudeTextView.setText("Latitud: " + location.getLatitude()); } else { longitutdeTextView.setText("Longitud: No disponible"); latitudeTextView.setText("Latitud: No disponible"); }

Como vemos, lo que hacemos es pedirle a Android cul es la ltima posicin que conoce a travs del GPS, y si no conoce ninguna (devolvera null), le preguntamos por el proveedor de red, y si an as no tenemos una posicin, mostramos que no tenemos la informacin disponible. Podemos intentar darle las posiciones al emulador con el DDMS, sin embargo, lo ms divertido es instalar esta aplicacin en un dispositivo Android y caminar, viendo cmo van cambiando los datos.

Desarrollo de Aplicaciones Mviles en Android Ejercicio Intermedio D: Localizacin por GPS Autores: Jorge Carballo Franquis David D. HarjaniHarjani

Pgina 5 de 9

C. Conclusin
La geo-localizacin es una de las cualidades ms solicitadas de todo smartphone, y sobre todo, de cualquier plataforma mvil. Es un recurso que podemos aplicar prcticamente en todos los aspectos de diseo en nuestras aplicaciones, y lo ms importante, an est pendiente de ser descubierto por la inmensa mayora de usuarios con telfonos mviles. En este ejercicio hemos introducido la API de localizacin, pero hay muchsimas cosas relacionadas con el entorno de un dispositivo Android que los alumnos estn todava por descubrir, como el acelermetro, la brjula digital, etc.

D. Notas Google Map


1. Al crear el proyecto debemos indicarle no la version 1.5, sino la de Google (para que incluya las libreras de los mapas). 2. Debemos crear un nuevo emulador indicndole lo mismo.

Desarrollo de Aplicaciones Mviles en Android Ejercicio Intermedio D: Localizacin por GPS Autores: Jorge Carballo Franquis David D. HarjaniHarjani

Pgina 6 de 9

3. Una vez que ya tengamos realizado todo el ejercicio anterior, debemos obtener la clave de:

keytool -list -alias androiddebugkey -keystore C:\Documents and Settings\CursoPude\.android\debug.keystore -storepass android keypass android

Insertamos el resultado en la siguiente pgina para obtener la clave: http://code.google.com/intl/es/android/maps-api-signup.html 4. Nos descargamos la imagen http://developer.android.com/resources/tutorials/views/images/androidmarker.png y la colocamos en la carpeta res/drawable/. 5. Aadimos al AndroidManifes.xml :
a. <uses-library android:name="com.google.android.maps" /> b. <uses-permission android:name="android.permission.INTERNET" />

6. Creamos un nuevo fichero de layout, con el siguiente contenido:


<?xml version="1.0" encoding="utf-8"?> <com.google.android.maps.MapView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/mapview" android:layout_width="fill_parent" android:layout_height="fill_parent" android:clickable="true" android:apiKey="Your Maps API Key goes here" />

Incluyendo la clave obtenida anteriormente sustituyendo al texto en negrita. 7. Creamos una nueva actividad que herede de la clase MapActivity. En el onCreate() de esta actividad hacemos el setContentView(), del fichero anterior. 8. Sobreescribimos el metodo siguiente (es obligado).
@Override protected boolean isRouteDisplayed() { return false; }

En el onCreate obtenemos el layout creado (acuerdense findView..), e indicarle que nos muestre los controles del mapa:

Desarrollo de Aplicaciones Mviles en Android Ejercicio Intermedio D: Localizacin por GPS Autores: Jorge Carballo Franquis David D. HarjaniHarjani

Pgina 7 de 9

setBuiltInZoomControls(true)

9. Vamos ahora a aadirle algo .. los valores de las coordenadas las obtendremos en el onCreate(), mediante el getIntent().getExtra() (ah est el bundle y obtenemos las coordenadas). 10. Creamos una nueva clase (MiIconito) que implemente ItemizedOverlay. En esa clase nos creamos un ArrayList de OverlayItems
private ArrayList<OverlayItem> mOverlays = new ArrayList<OverlayItem>();

11. Le incluimos los siguientes mtodos:


// Aade un item public void addOverlay(OverlayItem overlay) { mOverlays.add(overlay); populate(); }

@Override protected OverlayItem createItem(int i) { return mOverlays.get(i); } @Override public int size() { return mOverlays.size(); }

// Este ser nuestro contructor


public MiIconito (Drawable defaultMarker, Context context) { super(defaultMarker); mContext = context; } @Override protected boolean onTap(int index) { OverlayItem item = mOverlays.get(index); AlertDialog.Builder dialog = new AlertDialog.Builder(mContext); dialog.setTitle(item.getTitle()); dialog.setMessage(item.getSnippet()) dialog.show(); return true; }

Desarrollo de Aplicaciones Mviles en Android Ejercicio Intermedio D: Localizacin por GPS Autores: Jorge Carballo Franquis David D. HarjaniHarjani

Pgina 8 de 9

Ahora en el onCreate debemos aadirle:


List<Overlay> mapOverlays = mapView.getOverlays(); Drawable drawable = this.getResources().getDrawable(R.drawable.androidmarker); MiIconito itemizedoverlay = new MiIconito(drawable, Actividad.this);

Las coordenadas obtenidas mediante el bundle (sern 2 enteros -> getIntExtra()), y nos creamos un GeoPoint(), pasndole esos 2 enteros.
GeoPoint point OverlayItem overlayitem = new OverlayItem(point, "Hola, Mundo!", "Estoy aqu!!");

Y mostramos el punto mediante:


itemizedoverlay.addOverlay(overlayitem); mapOverlays.add(itemizedoverlay);

Desarrollo de Aplicaciones Mviles en Android Ejercicio Intermedio D: Localizacin por GPS Autores: Jorge Carballo Franquis David D. HarjaniHarjani

Pgina 9 de 9