Beruflich Dokumente
Kultur Dokumente
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.
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.
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.
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" />
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>();
@Override protected OverlayItem createItem(int i) { return mOverlays.get(i); } @Override public int size() { return mOverlays.size(); }
Desarrollo de Aplicaciones Mviles en Android Ejercicio Intermedio D: Localizacin por GPS Autores: Jorge Carballo Franquis David D. HarjaniHarjani
Pgina 8 de 9
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!!");
Desarrollo de Aplicaciones Mviles en Android Ejercicio Intermedio D: Localizacin por GPS Autores: Jorge Carballo Franquis David D. HarjaniHarjani
Pgina 9 de 9