Sensores de los dispositivos Sesión 2: Geolocalización y mapas 2012-2013 Depto. Ciencia de la Computación e IA
Puntos a tratar Geolocalización Actualización de la posición Alertas de proximidad Geocoder Mapas Localización en el mapa Marcadores Reconocimiento del habla 2
Geolocalización Proveedores GPS Localización fina Necesita dispositivo GPS Red Localización aproximada Usa la célula de la red móvil Permisos <uses- permission android:name= "android.permission.access_fine_location"/> <uses- permission android:name= "android.permission.access_coarse_location"/> 3
Obtener última localización Obtiene última posición registrada No solicita actualizarla al proveedor LocationManager manager = (LocationManager) this.getsystemservice(context.location_service); Location posicion = manager.getlastknownlocation(locationmanager.gps_provider); El objeto Location proporciona Latitud Longitud Altura Velocidad etc... 4
Obtener nueva posición class ListenerPosicion implements LocationListener { public void onlocationchanged(location location) { // Recibe nueva posición. public void onproviderdisabled(string provider){ // El proveedor ha sido desconectado. public void onproviderenabled(string provider){ // El proveedor ha sido conectado. public void onstatuschanged(string provider, int status, Bundle extras){ // Cambio en el estado del proveedor. ; 5
Solicitar actualización de posición Registramos el listener ListenerPosicion listener = new ListenerPosicion(); long tiempo = 5000; // 5 segundos float distancia = 10; // 10 metros manager.requestlocationupdates( LocationManager.GPS_PROVIDER, tiempo, distancia, listenerposicion); Puede tardar en obtener una primera posición Detenemos las actualizaciones manager.removeupdates(listener); 6
Alertas de proximidad Definimos un receptor de intents public class ReceptorProximidad extends BroadcastReceiver { @Override public void onreceive(context context, Intent intent) { // Comprobamos si estamos entrando o saliendo de la proximidad String key = LocationManager.KEY_PROXIMITY_ENTERING; Boolean entra = intent.getbooleanextra(key, false);... Programamos el aviso Intent intent = new Intent(codigo); PendingIntent pi = PendingIntent.getBroadcast(this, - 1, intent, 0); manager.addproximityalert(latitud, longitud, radio, caducidad, pi); IntentFilter filtro = new IntentFilter(codigo); registerreceiver(new ReceptorProximidad(), filtro); 7
Geocoder Transforma entre coordenadas y dirección Directo Universidad de Alicante Inverso [38.3852333,-0.51515] [38.3852333,-0.51515] Universidad de Alicante 8
Uso del geocoder Obtener el objeto Geocoder Geocoder geocoder = new Geocoder(this, Locale.getDefault()); Transformación directa List<Address> coordenadas = geocoder.getfromlocationname(direccion, maxresults); Transformación inversa List<Address> direcciones = geocoder.getfromlocation(latitud, longitud, maxresults); 9
Mapas de Google API no incluida en el SDK básico de Android Necesitamos incluir las librerías de Google Por ejemplo: Google APIs - API Level 8 (Android 2.2) Debemos crear el emulador también con esta API de Google Declarar la librería de Google en el manifest <application android:icon="@drawable/icon" android:label="@string/app_name"> <uses- library android:name="com.google.android.maps" />... <activity android:name=".mapasactivity" android:label="@string/app_name"> <intent- filter></intent- filter> </activity> </application> 10
Actividad del mapa La actividad del mapa debe heredar de MapActivity En el layout incluimos una vista con el mapa No se encuentra en la paleta de componente de Android <?xml version="1.0" encoding="utf- 8"?> <com.google.android.maps.mapview xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/mvmapa" android:layout_width="fill_parent" android:layout_height="fill_parent" android:apikey="vzqsgwnxea1f0kdyc1hvvv6c0jfrqw- myelyt6q" android:clickable="true" /> Necesitamos una clave de acceso a la API 11
Clave de acceso Clave vinculada al certificado con el que firmamos la aplicación La obtenemos a partir de la huella MD5 de dicho certificado keytool - list - alias miclave - keystore mialmacen.keystore En caso de utilizar el certificado de depuración por defecto keytool - list - alias androiddebugkey - keystore $HOME/.android/debug.keystore - storepass android - keypass android Obtendremos una clave como Huella digital de certificado (MD5): 52:D6:BD:27:A8:B1:5F:34:5A:BC:81:1C:76:E2:86:9F Debemos registrar en la web de Google Maps para Android http://code.google.com/android/maps- api- signup.html 12
Solicitud de la clave Introducimos huella MD5 de nuestro certificado en la web Obtenemos clave y ejemplo de uso 13
Configuración del mapa Podemos configurar la vista del mapa Activar/desactivar controles de zoom Vista satélite o mapa public class MapasActivity extends MapActivity { @Override public void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main); MapView mapview = (MapView) findviewbyid(r.id.mvmapa); mapview.setbuiltinzoomcontrols(true); mapview.setsatellite(true); 14
Controlador del mapa Nos permite movernos en el mapa MapController mc = mapview.getcontroller(); Cambiar nivel de zoom mc.setzoom(17); Mover a una posición La posición de indica mediante un objeto GeoPoint Las coordenadas se especifican como enteros (multiplicar por 10 6 ) GeoPoint p = new GeoPoint(LATITUD_1E6, LONGITUD_1E6); mc.setcenter(p); Mover a una posición mediante una animación mc.animateto(p); 15
Marcador de posición Podemos poner un marcador con nuestra posición Los marcadores se añaden como overlays MyLocationOverlay mylocation = new MyLocationOverlay(this, mapview); mapview.getoverlays().add(mylocation); 16
Habilitar seguimiento Podemos hacer que nuestra localización se actualice conforme nos movemos mylocation.enablemylocation(); Mover el mapa a nuestra posición cuando se obtenga mylocation.runonfirstfix(new Runnable() { public void run() { mc.animateto(mylocation.getmylocation()); ); Es importante detener las actualizaciones cuando se cierre la tarea o cuando pase a segundo plano @Override protected void onpause() { super.onpause(); location.disablemylocation(); Podemos volver a habilitarla en onresume 17
Puntos de interés Podemos añadirlos como overlays en el mapa ItemizedOverlay nos permite añadir un conjunto de puntos Cada punto se especifica como un objeto OverlayItem Para cada item especificamos un drawable como marcador ItemizedOverlay es una clase abstracta Debemos definir una subclase 18
ItemizedOverlay class RestaurantesItemizedOverlay extends ItemizedOverlay<OverlayItem> { private List<OverlayItem> mrestaurantes = new ArrayList<OverlayItem>(); public RestaurantesItemizedOverlay(Drawable defaultmarker) { super(defaultmarker); this.mrestaurantes = cargaritemsrestaurantes(); this.populate(); Puebla el mapa con los items @Override protected OverlayItem createitem(int i) { return mrestaurantes.get(i); @Override public int size() { return mrestaurantes.size(); Devuelve cada uno de los items Indica el número de items a mostrar 19
Marcador de los items Se especifica como drawable en el constructor Drawable marker = this.getresources().getdrawable(r.drawable.marker); ItemizedOverlay itemizedoverlay = new RestaurantesItemizedOverlay(marker); Debemos definir sus límites (bounds) Indica la forma de centrar el drawable en el punto del mapa Tenemos el método protegido boundcenter de ItemizedOverlay public RestaurantesItemizedOverlay(Drawable defaultmarker) { super(boundcenter(defaultmarker)); También tenemos boundcenterbottom para tipo chincheta 20
Configuración de los items Los creamos como objetos de tipo OverlayItem Proporcionamos coordenadas, nombre y descripción GeoPoint point = new GeoPoint((int) (restaurante.getlatitud() * 1E6), (int) (restaurante.getlongitud() * 1E6)); OverlayItem overlay = new OverlayItem(point, restaurante.getnombre(), restaurante.getdescripcion()); listarestaurantes.addoverlay(overlay); Podemos especificar un marcador propio Es importante definir los límites del marcador Drawable marcador = this.getresources().getdrawable(r.drawable.marker2); marcador.setbounds(0, 0, marcador.getintrinsicwidth(), marcador.getintrinsicheight()); overlay.setmarker(marcador); 21
Globos informativos El nombre y descripción deberemos mostrarlo nosotros Existen librerías que se encargan de hacer esto MapViewBalloons https://github.com/jgilfelt/android-mapviewballoons Nos muestra la información en forma de globos 22
Uso de MapViewBalloons Incluir en el proyecto Clases BalloonItemizedOverlay y BallonOverlayView Drawable para los marcadores marker.png Drawables para los globos balloon_overlay_close.png balloon_overlay_focused.9.png balloon_overlay_unfocused.9.png balloon_overlay_bg_selector.xml Heredamos de BalloonItemizedOverlay en lugar de ItemizedOverlay class RestaurantesItemizedOverlay extends BalloonItemizedOverlay<OverlayItem> { public RestaurantesItemizedOverlay(Drawable defaultmarker, MapView mapview) { super(boundcenter(defaultmarker), mapview);... 23
Reconocimiento del habla Transforma nuestra voz en texto Soporta diferentes idiomas Propiedad EXTRA_LANGUAGE Por ejemplo es- ES Dos modelos de lenguaje: Búsqueda web (LANGUAGE_MODEL_WEB_SEARCH) Libre (LANGUAGE_MODEL_FREE_FORM) Indicar el modelo de lenguaje es obligatorio Propiedad EXTRA_LANGUAGE_MODEL 24
Lanzar reconocimiento del habla Lanzamos la aplicación Intent intent = new Intent(RecognizerIntent.ACTION_RECOGNIZE_SPEECH); intent.putextra(parametro, valor); startactivityforresult(intent, codigo); Propiedades del reconocimiento (modo, idioma, etc) Obtenemos resultados @Override protected void onactivityresult(int requestcode, int resultcode, Intent data) { if (requestcode == codigo && resultcode == RESULT_OK) { ArrayList<String> resultados = data.getstringarraylistextra(recognizerintent.extra_results); // Utilizar los resultados obtenidos... super.onactivityresult(requestcode, resultcode, data); 25
Preguntas...? 26