GPS y Mapas Android - Tec · 2019-09-26 · Proyectos de desarrollo para dispositivos móviles GPS...

12
Proyectos de desarrollo para dispositivos móviles GPS y Mapas Android 1 Práctica (primera parte) 2 Vamos a crear un proyecto para leer datos del gps del teléfono. El sensor nos entrega latitud, longitud y otros datos. Usaremos el API de Google para convertir los valores de latitud y longitud en una dirección en texto del lugar donde se encuentre el teléfono. También, podemos descargar una imagen con el mapa. Mostraremos un mapa interactivo con algunos elementos como marcadores, rutas, etc.

Transcript of GPS y Mapas Android - Tec · 2019-09-26 · Proyectos de desarrollo para dispositivos móviles GPS...

Page 1: GPS y Mapas Android - Tec · 2019-09-26 · Proyectos de desarrollo para dispositivos móviles GPS y Mapas Android!1 Práctica (primera parte)!2 Vamos a crear un proyecto para leer

Proyectos de desarrollo para dispositivos móviles

GPS y Mapas Android

!1

Práctica (primera parte)

!2

❖ Vamos a crear un proyecto para leer datos del gps del teléfono.

❖ El sensor nos entrega latitud, longitud y otros datos.

❖ Usaremos el API de Google para convertir los valores de latitud y longitud en una dirección en texto del lugar donde se encuentre el teléfono. También, podemos descargar una imagen con el mapa.

❖ Mostraremos un mapa interactivo con algunos elementos como marcadores, rutas, etc.

Page 2: GPS y Mapas Android - Tec · 2019-09-26 · Proyectos de desarrollo para dispositivos móviles GPS y Mapas Android!1 Práctica (primera parte)!2 Vamos a crear un proyecto para leer

Crea el proyecto❖ Crea un proyecto nuevo en Android Studio.

!3

Tu primer nombre

Permisos❖ Hay dos permisos:➡ ACCESS_COARSE_LOCATION. Redes, precisión de una cuadra. Más rápido. Menos batería.

➡ ACCESS_FINE_LOCATION. GPS, precisión de hasta 5 metros. Más lento. Más batería.

❖ Agrega el permiso adecuado en el Manifiesto de la aplicación. Para la práctica, agrega el primero.

❖ Agrega un requerimiento de hardware. Obligatorio para el API 21 o mayor.

!4

Page 3: GPS y Mapas Android - Tec · 2019-09-26 · Proyectos de desarrollo para dispositivos móviles GPS y Mapas Android!1 Práctica (primera parte)!2 Vamos a crear un proyecto para leer

Crear el administrador❖ Agrega la variable de instancia gps de tipo LocationManager.

❖ Crea el método configurarGPS() y llámalo desde onCreate.

private fun configurarGPS() { // Crea el administrador del sensor de GPS gps = getSystemService(Context.LOCATION_SERVICE) as LocationManager if (!gps.isProviderEnabled(LocationManager.NETWORK_PROVIDER)) { // Abrir settings para prender el GPS, no se puede hacer con código prenderGPS(); } }

!5

Prender GPSprivate fun prenderGPS() { // El usuario lo enciende, no se puede con programación val dialogo = AlertDialog.Builder(this) dialogo.setMessage("El GPS está apagado, ¿Quiere prenderlo?") .setCancelable(false) .setPositiveButton("Si", object : DialogInterface.OnClickListener { override fun onClick(p0: DialogInterface?, p1: Int) { startActivity(Intent(android.provider.Settings.ACTION_LOCATION_SOURCE_SETTINGS)) } }) .setNegativeButton("No", object: DialogInterface.OnClickListener { override fun onClick(dialogo: DialogInterface?, p1: Int) { dialogo?.dismiss() } }) val alerta = dialogo.create() alerta.show() }

!6

Page 4: GPS y Mapas Android - Tec · 2019-09-26 · Proyectos de desarrollo para dispositivos móviles GPS y Mapas Android!1 Práctica (primera parte)!2 Vamos a crear un proyecto para leer

Iniciar las actualizaciones

override fun onStart() { super.onStart() // Prueba si tiene el permiso if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { // No lo tiene, solicitarlo ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.ACCESS_COARSE_LOCATION), PERMISO_GPS) // Contesta con onRequestPermissionsResult } else { // Ya tiene permiso, iniciar actualizaciones gps.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 0f, this)

onLocationChanged(gps.getLastKnownLocation(LocationManager.NETWORK_PROVIDER)) } }

❖ La actividad implementa LocationListener y sobrescribe los métodos correspondientes.

PERMISO_GPSConstante con

valor 200

La actividad debe implementarLocationListener

!7

Posición

Iniciar las actualizaciones❖ Al contestar el usuario, se ejecuta el siguiente método.override fun onRequestPermissionsResult(requestCode: Int, permissions: Array<out String>, grantResults: IntArray) { if (requestCode==PERMISO_GPS && grantResults.size>0) { if (grantResults[0] == PackageManager.PERMISSION_GRANTED) { // Otorgó el permiso if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) { gps.requestLocationUpdates(LocationManager.NETWORK_PROVIDER, 1000, 0f, this)

onLocationChanged(gps.getLastKnownLocation(LocationManager.NETWORK_PROVIDER)) } } else { // Mostrar mensaje sobre cómo activar el permiso } } }

!8

Page 5: GPS y Mapas Android - Tec · 2019-09-26 · Proyectos de desarrollo para dispositivos móviles GPS y Mapas Android!1 Práctica (primera parte)!2 Vamos a crear un proyecto para leer

❖ Construye la siguiente GUI para mostrar la ubicación.

Mostrar la ubicación

!9

Actualizando datos❖ Cada vez que se detecta una nueva ubicación se ejecuta

el método onLocationChanged.override fun onLocationChanged(location: Location?) { etLatitud.setText("${location?.latitude}") etLongitud.setText(“${location?.longitude}”) posicion = location }

❖ posicion es una variable de instancia de tipo Location. Ésta guarda la última posición conocida.

!10

Page 6: GPS y Mapas Android - Tec · 2019-09-26 · Proyectos de desarrollo para dispositivos móviles GPS y Mapas Android!1 Práctica (primera parte)!2 Vamos a crear un proyecto para leer

Corre tu app❖ Ejecuta tu app y verifica el funcionamiento.

➡ Si el teléfono/simulador tiene un API menor a 23, entra directamente a las actualizaciones. El permiso lo toma del manifiesto.

➡ Si el API es 23 o mayor, pregunta al usuario por el permiso.

➡ En el simulador, las coordenadas las puedes definir con los controles.

!11

Usando GPS

La práctica anterior utiliza las redes para ubicar al dispositivo, si necesitas mayor precisión, debes usar el sensor de GPS.

❖ Agrega los permisos en el Manifiesto.

❖ Cambia LocationManager.NETWORK_PROVIDER por LocationManager.GPS_PROVIDER

❖ Cambia Manifest.permission.ACCESS_COARSE_LOCATION por Manifest.permission.ACCESS_FINE_LOCATION

❖ Puedes tener los dos esquemas al mismo tiempo en tu app.

!12

Page 7: GPS y Mapas Android - Tec · 2019-09-26 · Proyectos de desarrollo para dispositivos móviles GPS y Mapas Android!1 Práctica (primera parte)!2 Vamos a crear un proyecto para leer

Obtener la dirección en texto❖ Para obtener la dirección usamos el API de Google.➡ https://developers.google.com/maps/documentation/geocoding/intro?hl=es-419

➡ https://developers.google.com/maps/documentation/geocoding/intro?hl=es-419#ReverseGeocoding

❖ Hay un servicio que recibe latitud y longitud. Regresa un JSON con la dirección.

❖ https://maps.googleapis.com/maps/api/geocode/json?latlng=19.5972783,-99.226764&key=YOUR_API_KEY

!13

Para obtener una llave, necesitas registrar una tarjeta

de crédito

Segunda opción para obtener la dirección en texto

❖ El API de Google solo da una descarga/día gratuita. Para esta práctica, usa un servicio alterno:

❖ https://geocode.xyz/19.5972783,-99.226764?geoit=json

❖ https://developer.mapquest.com/documentation/geocoding-api/reverse/get/

❖ https://opencagedata.com/

❖ https://api.opencagedata.com/geocode/v1/json?q=19.5974136,-99.2259578&key=API_KEY

!14

Page 8: GPS y Mapas Android - Tec · 2019-09-26 · Proyectos de desarrollo para dispositivos móviles GPS y Mapas Android!1 Práctica (primera parte)!2 Vamos a crear un proyecto para leer

Mostrar el mapa❖ Descargar los datos de la página:

- https://opencagedata.com/

❖ Lanza un Intent con el url del mapa:val url = "https://www.google.com/maps/search/?api=1&query=$latitud,$longitud" val intMapa = Intent(Intent.ACTION_VIEW, Uri.parse(url)) startActivity(intMapa)

!15

https://www.google.com/maps/search/?api=1&query=19.5953423,-99.2275591

Descarga la direcciónprivate fun descargarDireccion() { val latitud = posicion?.latitude val longitud = posicion?.longitude val dir = "https://api.opencagedata.com/geocode/v1/json?key=a335b6a6e73145e193f2f9f6c7c29ad7&q="+latitud+","+longitud; AndroidNetworking.get(dir) .build() .getAsJSONObject(object: JSONObjectRequestListener { override fun onResponse(response: JSONObject?) { val arrResultados = response?.get("results") as JSONArray val resultado = arrResultados.get(0) as JSONObject val direcccion = resultado.get("formatted") as String etDireccion.setText(direcccion) val url = "https://www.google.com/maps/search/?api=1&query=$latitud,$longitud" val intMapa = Intent(Intent.ACTION_VIEW, Uri.parse(url)) startActivity(intMapa) }

override fun onError(anError: ANError?) { etDireccion.setText("${anError!!}") }

}) }

!16

Page 9: GPS y Mapas Android - Tec · 2019-09-26 · Proyectos de desarrollo para dispositivos móviles GPS y Mapas Android!1 Práctica (primera parte)!2 Vamos a crear un proyecto para leer

Evaluación❖ Toma dos capturas de tu pantalla, servirán como

evidencia de la práctica.

!17

Segunda parte. Mapa interactivo

❖ Crea un proyecto nuevo.

❖ API mínimo 19.

❖ Google Maps Activity.

!18

tu primer nombre

Page 10: GPS y Mapas Android - Tec · 2019-09-26 · Proyectos de desarrollo para dispositivos móviles GPS y Mapas Android!1 Práctica (primera parte)!2 Vamos a crear un proyecto para leer

Configurar el mapa❖ Crea una llave para usar el

mapa (distinta de geocoding y mapas estáticos).❖ El archivo

google_maps_api.xml tiene las instrucciones.

❖ Cambia la ubicación inicial para que muestre el estadio del Tec con un zoom de 18.

!19

override fun onMapReady(googleMap: GoogleMap) { mMap = googleMap

// Add a marker in Sydney and move the camera val tec = LatLng(19.594210, -99.228167) mMap.addMarker(MarkerOptions() .position(tec) .title("Tec") .snippet("ITESM Campus Estado de México"))

mMap.moveCamera(CameraUpdateFactory.newLatLng(tec)) val camara = CameraPosition.Builder().target(tec).zoom(15f).build() mMap.animateCamera(CameraUpdateFactory.newCameraPosition(camara))

}

Prueba❖ Corre tu aplicación.

❖ Si pide permiso para usar GPS, concede el permiso.

❖ Actualiza Google Play Services. (También en el emulador)

❖ Verifica que muestra un marcador en el estadio.

!20

Page 11: GPS y Mapas Android - Tec · 2019-09-26 · Proyectos de desarrollo para dispositivos móviles GPS y Mapas Android!1 Práctica (primera parte)!2 Vamos a crear un proyecto para leer

Agrega gps❖ Habilita la posición del usuario.

mMap.isMyLocationEnabled = true // Permisos de GPS

❖ Integra el gps de la práctica anterior para que cada vez que detecte un cambio en la ubicación, agregue un marcador y la cámara se actualice.

❖ Solo agrega el marcador si la distancia de la nueva posición y la anterior es mayor a 10 metros.

❖ Haz un recorrido por el campus, debes visitar al menos biblioteca, Aulas I, cosa roja, aulas VI, CCI y regresar al CEDETEC.

!21

Evaluación.❖ Toma una o varias capturas de pantalla que servirán

como evidencia de esta segunda parte.

❖ Sube a Blackboard las capturas de pantalla (primera y segunda parte) y el proyecto completo con la segunda parte de la práctica.

❖ El código de la primera parte no se sube.

!22

Page 12: GPS y Mapas Android - Tec · 2019-09-26 · Proyectos de desarrollo para dispositivos móviles GPS y Mapas Android!1 Práctica (primera parte)!2 Vamos a crear un proyecto para leer

Ligas interesantes❖ https://developers.google.com/maps/documentation/android-sdk/intro

❖ http://geoawesomeness.com/google-maps-api-alternatives-best-cheap-affordable/

!23

Datos

!24

https://api.opencagedata.com/geocode/v1/json?q=19.5974136,-99.2259578&key=a335b6a6e73145e193f2f9f6c7c29ad7&pretty=1