contacto[arroba]digitallearning.es

Proyecto Geolocalización Android

Post Series: Geolocalización en Android

En este ejercicio práctico explicaremos el proceso de geolocalización de un dispositivo Android, mostrando los datos de su ubicación (latitud, longitud, altitud y precisión de la señal) y actualizando de forma constante sus cambios de posición. También podremos visualizar su posición en un mapa de Google, junto con un marcador que mostrará los datos de dirección física del dispositivo.

Puedes descargar todo el código del proyecto al final del tutorial.

En esta aplicación, la información se presentará  en dos pantallas que se muestran en las imágenes de abajo. Como particularidad, se podrá observar como la pantalla que muestra las coordenadas recoge los valores a partir de la opción GPS del emulador Genymotion:

Pantalla menú App Geolocalización Android
Ubicación en Mapa de Google

 

Elementos y estructura del proyecto

Vamos a describir brevemente los elementos necesarios para el desarrollo de este proyecto que hemos denominado “Geolocalizacion”:

  • Clase SplashScreen, que herede de la clase base Activity, encargada de lanzar una pantalla de presentación al iniciar la aplicación, proporcionando una mayor inmersión del usuario en la aplicación.
  • Clase MainActivity, que herede de la clase base Activity, que permitirá mostrar los datos asociados a la localización del dispositivo GPS.
  • Clase Mapa, que herede de la clase base FragmentActivity e implemente la interfaz OnMapReadyCallback, encargada de mostrar la conversión de los datos de latitud y longitud en una dirección física dentro de un mapa de Google.
  • Layout activity_splash_screen.xml, formado por una componente de tipo ImageView, que mostrará el logotipo de la aplicación.
  • Layout activity_main.xml, formado por cuatro componentes de tipo TextView que mostrarán los datos referentes a las coordenadas de latitud y longitud, además de la altura y precisión de la localización del dispositivo, y un componente de tipo Button, encargado de enviar los datos de las coordenadas obtenidas a la siguiente Activity para la visualización de la posición dentro de un mapa. Además se define un componente de tipo TextView en la parte superior de la pantalla, que indicará si los valores mostrados son valores por defecto o valores proporcionados por el GPS.
  • Layout activity_maps.xml, formado por un fragment, que posibilita la implementación de diferentes layouts en tiempo de ejecución, y que en este caso mostrará el servicio de mapas de Google.

Puedes ver la estructura del proyecto en la siguiente imagen:

Estructura Proyecto Android Geolocalización

Documentación código fuente

Detallamos las diferentes clases, interfaces y métodos que definimos en el proyecto. Asimismo veremos los ficheros de layout y controles que implementan.

Geolocalizacion\app\src\main\java\com\academiaandroid\geolocalizacion\MainActivity.java

  1. Se define la clase MainActivity, que hereda de la clase base Activity, y que permite mostrar los datos asociados a la localización del dispositivo GPS:
  2. Posteriormente, se declaran la clase e interfaz encargados de acceder a los datos de posicionamiento del dispositivo. Además dentro del método onCreate() se asignan los controles definidos en el layout a cada variable definida:
  3. El método rastreoGPS() se encargará de detectar el cambio de la posición del dispositivo GPS, actualizando los valores mostrados por pantalla:
  4. Para finalizar dentro de este método, se invocará a requestLocationUpdates(), encargado establecer la localización actualizada, recibiendo como parámetros de entrada el nombre del proveedor de localización GPS, el intervalo de tiempo entre cada actualización, distancia en metros entre localizaciones actualizadas, y la variable de tipo LocationListener que actualizará la localización en caso de producirse nuevos cambios:
  5. Por último, dentro de esta clase, se define un método que recibe como parámetro de entrada una variable de tipo Location, y que permitirá mostrar los diferentes datos de la ubicación geográfica del dispositivo. En el supuesto de no tener habilitada la opción de ubicación, se establecerán valores por defecto (dichos valores se almacenarán en un array de tipo String):

Geolocalizacion\app\src\main\java\com\academiaandroid\geolocalizacion\Mapa.java

  1. Se define una nueva clase llamada Mapa, que hereda de la clase base FragmentActivity, y que además implementa la interfaz OnMapReadyCallback,
    que posibilita la visualización de un mapa con los datos de la localización obtenidos de la Activity principal.
  2. Dentro del método onCreate(), se reciben los datos de las coordenadas obtenidas en la Activity principal, para a continuación llamar al método mapaDisponible():
  3. El método mapaDisponible(), comprobará si el control asignado a la variable de tipo SupportMapFragment se ha definido en el layout de la Activity:
  4. Finalmente en este clase se implementa el método onMapReady(), implementado por la interfaz OnMapReadyCallback, que recibe como parámetro de entrada una variable de tipo GoogleMap, y cuya tarea principal será la de convertir los valores de las coordenadas recibidas de la Activity anterior, en una dirección física dentro de Google Maps. Además de lo comentado anteriormente, desde este método se configurará tanto la posición de la cámara, como los datos que se mostrarán en el marcador que identifique la localización del dispositivo:
    • Se asignan y convierten los valores de latitud y longitud visualizados en la Activity principal a tipo double:
    • Se declara y crea un objeto de la clase Geocoder, encargada de transformar los datos de latitud y longitud obtenidos en una dirección física en el mapa (y viceversa):
    • Se asigna el tipo de vista al mapa:
    • Se habilita la localización del dispositivo en el mapa:
    • Se comprueba que el número de direcciones almacenadas es mayor a 0:
    • Se asignan los datos de dirección, código postal, ciudad y país:
    • A continuación, se define el marcador que se mostrará en la posición dada, y que permitirá visualizar los datos en el mapa al pulsar sobre dicho marcador:
    • En las siguientes líneas se indica la posición de la cámara para la visualización del mapa de Google, dónde además se establecen los ajustes de zoom, inclinación y dirección:
    • Por último se invoca al método encargado de actualizar el movimiento de la cámara y el tiempo de duración para actualizar dicho movimiento:

Geolocalizacion\app\src\main\res\layout\activity_main.xml

A nivel de layout (activity_main.xml), se implementan cinco controles de tipo TextView (se mencionarán sólo aquellos controles destinados a ser asignados en el controlador), encargados de mostrar los datos de latitud, longitud, altitud y precisión de la posición del dispositivo, además de indicar si los datos recogidos son valores por defecto o proporcionados por el sistema de posicionamiento global (GPS), y mediante un control de tipo Button, se enviarán dichos datos a la siguiente Activity:

Geolocalizacion\app\src\main\res\layout\activity_maps.xml

Al implementar una nueva Activity de tipo Google Maps, creará por defecto un layout formado por un fragment, que haciendo uso de las coordenadas obtenidas en la Activity principal, mostrará en un mapa de Google la localización del dispositivo GPS:

Permisos declarados en AndroidManifest.xml:

Por último recordar que será necesario declarar dentro del AndroidManifest.xml los diferentes permisos necesarios tanto para la conexión de Internet, como el acceso al estado de red, la escritura en almacenamiento externo y la lectura de servicios de Google:

Implementación de key para servicio de mapas de Google:

AndroidManifest.xml

Geolocalizacion\app\src\debug\res\values\google_maps_api.xml

Nota: como ya se ha comentado en un tutorial anterior, será necesaria la creación de una key (clave) para el uso de los servicios de mapas de Google en una aplicación propia.

Descarga del proyecto

A continuación puedes descargar todo el código del proyecto:

Descargar

This Post Has 4 Comments

  1. Muy útil a la vez que bien explicado. Quizás comentar que a partir de la versión 6 de Android (API 23), las aplicaciones que utilizan la localización GPS requieren permisos en tiempo de ejecución y Android pide que lo contemples explícitamente en el código. Yo lo he solucionado de la siguiente forma.

    /*Método encargado de actualizar la posición del dispositivo
    GPS cuando este cambie de localización.*/
    private void rastreoGPS() {
    /*Se asigna a la clase LocationManager el servicio a nivel de sistema a partir del nombre.*/
    locManager = (LocationManager) getSystemService(Context.LOCATION_SERVICE);

    /*Se declara y asigna a la clase Location la última posición conocida proporcionada por el proveedor.*/
    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {
    if (checkSelfPermission(Manifest.permission.ACCESS_FINE_LOCATION) != PackageManager.PERMISSION_GRANTED && checkSelfPermission(Manifest.permission.ACCESS_COARSE_LOCATION) != PackageManager.PERMISSION_GRANTED) {
    return;
    }
    else{
    Location loc = locManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
    mostrarPosicion(loc);
    }
    }else{
    Location loc = locManager.getLastKnownLocation(LocationManager.GPS_PROVIDER);
    mostrarPosicion(loc);
    }

    Un tutorial magnífico.
    Gracias.

    1. Daniel sabes donde puedo conseguir el proyecto ? estoy en uno donde quiero mostrar distintas ubicaciones y que se vayan actualizando
      Gracias de antemano.

Comments are closed.