Xamarin.Essentials: La Geolocalización - Xamarin Forms

La geolocalización es una funcionalidad esencial en muchas aplicaciones móviles modernas, permitiendo obtener la ubicación actual del dispositivo para diversas funciones como navegación, entrega de servicios basados en ubicación y más. En este artículo, aprenderemos a integrar la geolocalización en una aplicación Xamarin Forms utilizando Xamarin.Essentials.

Vamos a construir una aplicación completa que mostrará la ubicación actual del dispositivo y permitirá rastrear los cambios en la ubicación en tiempo real. Este artículo está enfocado en dispositivos Android y se explicará paso a paso cada componente y código.

 

Introducción a Xamarin.Essentials y La Geolocalización

Xamarin.Essentials es una biblioteca que proporciona acceso a las funcionalidades nativas del dispositivo de una manera fácil y multiplataforma. La funcionalidad de Geolocalización de Xamarin.Essentials permite obtener la latitud, longitud y otros detalles de la ubicación actual del dispositivo.

La clase Geolocation dentro de Xamarin.Essentials proporciona métodos para obtener la ubicación actual y también permite rastrear los cambios en la ubicación en tiempo real.

Beneficios de Usar Xamarin.Essentials para Geolocalización

  • Multiplataforma: Permite acceder a la geolocalización en dispositivos Android y iOS de manera uniforme.
  • Fácil de Usar: Simplifica la interacción con los sensores de ubicación y el manejo de permisos.
  • Manejo de Errores Incorporado: Gestiona fácilmente errores comunes como falta de permisos, servicios deshabilitados, etc.

 

Requisitos Previos

Antes de comenzar, asegúrate de tener lo siguiente:

  • Visual Studio: Preferiblemente la última versión con soporte para Xamarin.
  • Xamarin Forms: Instalado y configurado en el proyecto.
  • Un dispositivo físico Android o un emulador con soporte GPS.
  • Xamarin.Essentials: Agregado a tu proyecto a través de NuGet.

 

Configuración del Proyecto en Visual Studio

1. Crear el Proyecto

  1. Abre Visual Studio y crea un nuevo proyecto Xamarin Forms seleccionando la plantilla Blank App (Xamarin.Forms).
  2. Asegúrate de seleccionar Android como plataforma de destino, además de iOS si estás trabajando en macOS.

2. Añadir Xamarin.Essentials

  1. Haz clic derecho en la solución y selecciona Manage NuGet Packages.
  2. Busca Xamarin.Essentials y selecciona la última versión estable.
  3. Instálalo en los proyectos compartido, Android o iOS.

3. Inicializar Xamarin.Essentials

En la clase MainActivity.cs del proyecto Android, debes inicializar Xamarin.Essentials en el método OnCreate.

protected override void OnCreate(Bundle savedInstanceState)
{
    base.OnCreate(savedInstanceState);
    
    // Inicializar Xamarin.Essentials antes de cargar cualquier otro servicio
    Xamarin.Essentials.Platform.Init(this, savedInstanceState);
    
    // Inicializar Xamarin Forms
    global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
    LoadApplication(new App());
}

public override void OnRequestPermissionsResult(int requestCode, string[] permissions, Permission[] grantResults)
{
    Xamarin.Essentials.Platform.OnRequestPermissionsResult(requestCode, permissions, grantResults);
    base.OnRequestPermissionsResult(requestCode, permissions, grantResults);
}

Esto asegura que los permisos solicitados por Xamarin.Essentials se gestionen correctamente.

 

Configuración de Permisos para Android

Para acceder a la geolocalización en Android, debemos declarar los permisos necesarios en el archivo AndroidManifest.xml.

  1. Abre el archivo AndroidManifest.xml en el proyecto Android.
  2. Añade los siguientes permisos dentro del nodo <manifest>:
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
  • ACCESS_FINE_LOCATION: Permite obtener la ubicación precisa del dispositivo (GPS).
  • ACCESS_COARSE_LOCATION: Permite obtener la ubicación aproximada (red Wi-Fi o celular).

Si estás desarrollando para Android 10 o superior, también debes añadir el siguiente permiso:

<uses-permission android:name="android.permission.ACCESS_BACKGROUND_LOCATION" />

Este permiso es necesario si la aplicación necesita acceder a la ubicación en segundo plano.

 

Implementación de la Geolocalización

Paso 1: Obtener la Ubicación Actual

Crea una nueva página llamada GeolocationPage.xaml en el proyecto compartido para mostrar la información de la ubicación.

<ContentPage xmlns="http://xamarin.com/schemas/2014/forms"
             xmlns:x="http://schemas.microsoft.com/winfx/2009/xaml"
             x:Class="GeolocationApp.GeolocationPage"
             Title="Geolocalización">
    <StackLayout Padding="20">
        <Label Text="Ubicación Actual" FontSize="Large" />
        <Label x:Name="latitudeLabel" Text="Latitud: " />
        <Label x:Name="longitudeLabel" Text="Longitud: " />
        <Button Text="Obtener Ubicación" Clicked="OnGetLocationClicked" />
    </StackLayout>
</ContentPage>

Ahora, implementa el código detrás en GeolocationPage.xaml.cs para obtener la ubicación actual usando Xamarin.Essentials:

using Xamarin.Essentials;
using Xamarin.Forms;

namespace GeolocationApp
{
    public partial class GeolocationPage : ContentPage
    {
        public GeolocationPage()
        {
            InitializeComponent();
        }

        // Evento que se dispara al presionar el botón "Obtener Ubicación"
        private async void OnGetLocationClicked(object sender, EventArgs e)
        {
            try
            {
                // Verifica si los permisos están otorgados
                var location = await Geolocation.GetLastKnownLocationAsync();

                // Si la ubicación es nula, obtenemos una nueva ubicación
                if (location == null)
                {
                    location = await Geolocation.GetLocationAsync(new GeolocationRequest
                    {
                        DesiredAccuracy = GeolocationAccuracy.Medium,
                        Timeout = TimeSpan.FromSeconds(30)
                    });
                }

                // Actualizamos las etiquetas con la latitud y longitud
                if (location != null)
                {
                    latitudeLabel.Text = $"Latitud: {location.Latitude}";
                    longitudeLabel.Text = $"Longitud: {location.Longitude}";
                }
                else
                {
                    await DisplayAlert("Error", "No se pudo obtener la ubicación", "OK");
                }
            }
            catch (FeatureNotSupportedException fnsEx)
            {
                // El dispositivo no soporta la geolocalización
                await DisplayAlert("Error", "Función no soportada en este dispositivo", "OK");
            }
            catch (PermissionException pEx)
            {
                // Los permisos no están otorgados
                await DisplayAlert("Error", "Permisos de ubicación denegados", "OK");
            }
            catch (Exception ex)
            {
                // Otro tipo de error
                await DisplayAlert("Error", $"Error al obtener la ubicación: {ex.Message}", "OK");
            }
        }
    }
}
  • Geolocation.GetLastKnownLocationAsync(): Intenta obtener la última ubicación conocida, si está disponible, de manera rápida. Es útil para mostrar al usuario una ubicación inicial sin esperar demasiado.
  • Geolocation.GetLocationAsync(): Obtiene la ubicación actual del dispositivo, utilizando el GeolocationRequest para especificar la precisión deseada y el tiempo de espera. Si la última ubicación conocida es nula, intenta obtener una nueva ubicación.
  • Manejo de Excepciones:
    • FeatureNotSupportedException: Indica que el dispositivo no soporta la funcionalidad de geolocalización.
    • PermissionException: Indica que los permisos de ubicación no han sido otorgados por el usuario.
    • Exception: Captura cualquier otro tipo de error no previsto.

Paso 2: Rastrear Cambios en la Ubicación

Para rastrear cambios en la ubicación en tiempo real, necesitamos implementar un método para escuchar continuamente las actualizaciones de ubicación.

Añade botones para activar/desactivar el seguimiento de ubicación en GeolocationPage.xaml:

<Button Text="Iniciar Rastreo de Ubicación" Clicked="OnStartTrackingClicked" />
<Button Text="Detener Rastreo de Ubicación" Clicked="OnStopTrackingClicked" />

En el código c#, implementa los métodos para comenzar y detener el rastreo:

private async void OnStartTrackingClicked(object sender, EventArgs e)
{
    try
    {
        // Inicia el rastreo de ubicación
        Geolocation.LocationChanged += OnLocationChanged;
        await Geolocation.StartListeningAsync(new GeolocationListeningRequest
        {
            DesiredAccuracy = GeolocationAccuracy.Medium,
            Interval = TimeSpan.FromSeconds(10) // Intervalo de tiempo entre cada actualización
        });
        await DisplayAlert("Éxito", "Rastreo de ubicación iniciado", "OK");
    }
    catch (Exception ex)
    {
        await DisplayAlert("Error", $"No se pudo iniciar el rastreo: {ex.Message}", "OK");
    }
}

private async void OnStopTrackingClicked(object sender, EventArgs e)
{
    try
    {
        // Detiene el rastreo de ubicación
        await Geolocation.StopListeningAsync();
        Geolocation.LocationChanged -= OnLocationChanged;
        await DisplayAlert("Éxito", "Rastreo de ubicación detenido", "OK");
    }
    catch (Exception ex)
    {
        await DisplayAlert("Error", $"No se pudo detener el rastreo: {ex.Message}", "OK");
    }
}

private void OnLocationChanged(object sender, LocationChangedEventArgs e)
{
    var location = e.Location;
    latitudeLabel.Text = $"Latitud: {location.Latitude}";
    longitudeLabel.Text = $"Longitud: {location.Longitude}";
}
  • Geolocation.StartListeningAsync(): Inicia la escucha de actualizaciones de ubicación con un intervalo de actualización especificado. Cada vez que la ubicación cambia, se llama al evento OnLocationChanged.
  • Geolocation.StopListeningAsync(): Detiene el rastreo de la ubicación.
  • OnLocationChanged(): Este evento se dispara cada vez que la ubicación cambia, actualizando las etiquetas con la nueva latitud y longitud.

 

Probar la Aplicación

Para probar la aplicación, es recomendable usar un dispositivo físico Android con GPS habilitado. Si usas un emulador, asegúrate de habilitar la simulación de ubicación.

  1. Instala la Aplicación en tu Dispositivo: Usa un cable USB para conectar tu dispositivo Android a la computadora e instala la aplicación desde Visual Studio.
  2. Activa el GPS: Asegúrate de que el GPS esté activado en tu dispositivo.
  3. Permisos de Ubicación: La aplicación debería solicitar permisos de ubicación la primera vez que intentes obtener la ubicación. Asegúrate de aceptar estos permisos.
  4. Prueba de Ubicación: Haz clic en el botón "Obtener Ubicación" y verifica que la ubicación actual se muestre correctamente. Luego, inicia el rastreo de ubicación y muévete con el dispositivo para verificar que la ubicación se actualiza en tiempo real.

 

Posibles Extensiones del Proyecto

  • Integración con Mapas: Usa Xamarin.Forms.Maps para mostrar la ubicación actual en un mapa interactivo.
  • Geocoding y Reverse Geocoding: Convierte una dirección en coordenadas de latitud y longitud, y viceversa.
  • Geofencing: Implementa alertas basadas en la entrada o salida de una región geográfica específica.
  • Almacenar la Ubicación en una Base de Datos: Almacena las ubicaciones obtenidas en una base de datos local para mostrar un historial de movimientos.

Con esto hemos cubierto cómo implementar la geolocalización en una aplicación Xamarin Forms utilizando Xamarin.Essentials, mostrando cómo obtener la ubicación actual y rastrear los cambios en tiempo real.

 

   EtiquetasXamarin Android .NET Standard

  Compartir


  Nuevo comentario

El campo Comentario es obligatorio.
El campo Nombre es obligatorio.

  Comentarios

No hay comentarios para este Post.



Utilizamos cookies propias y de terceros para mejorar nuestros servicios y ofrecerle una mejor experiencia de navegación. Si continúa navegando consideramos que acepta su uso. Más información   Acepto