Quiero conseguir mi posición actual cada marco con xamarin. formas

Tengo mi posición una vez cuando llamo a la función pero quiero conseguir mi posición cada marco en la aplicación. Cuando me muevo con el teléfono, la posición cambia. He intentado hacerlo mientras (verdad) pero no funcionó. cuando lo llamo en la función principal. se ejecutará una vez. y esta es mi función.

 public async Task GetCurrentLocation()
    {
       var p = new Location();
        try
        {
            var request = new GeolocationRequest(GeolocationAccuracy.Medium, TimeSpan.FromSeconds(10));

            cts = new CancellationTokenSource();

            var location = await Geolocation.GetLocationAsync(request, cts.Token);

             if (location != null)
             {
                 Console.WriteLine($"Latitude: {location.Latitude}, Longitude: {location.Longitude}, Altitude: {location.Altitude}");

                 map.MoveToRegion(MapSpan.FromCenterAndRadius(new Position(location.Latitude, location.Longitude), Distance.FromMeters(100)));

            }
            return location;

        }
        catch (FeatureNotSupportedException fnsEx)
        {
            await DisplayAlert("Faild", fnsEx.Message, "OK");
        }
        catch (PermissionException pEx)
        {
            await DisplayAlert("Faild", pEx.Message, "OK");
        }
        catch (Exception ex)
        {
            await DisplayAlert("Faild", ex.Message, "OK");
        }
        return p;
    }

Pregunta hecha hace 3 años, 4 meses, 26 días - Por javajedi


3 Respuestas:

  • utilizar el GeoLocator plugin

    async Task StartListening()
    {
        if(CrossGeolocator.Current.IsListening)
            return;
        
      await CrossGeolocator.Current.StartListeningAsync(TimeSpan.FromSeconds(5), 10, true);
    
      CrossGeolocator.Current.PositionChanged += PositionChanged;
      CrossGeolocator.Current.PositionError += PositionError;
    }
    
    private void PositionChanged(object sender, PositionEventArgs e)
    {
      
      //If updating the UI, ensure you invoke on main thread
      var position = e.Position;
      var output = "Full: Lat: " + position.Latitude + " Long: " + position.Longitude;
      output += "\n" + $"Time: {position.Timestamp}";
      output += "\n" + $"Heading: {position.Heading}";
      output += "\n" + $"Speed: {position.Speed}";
      output += "\n" + $"Accuracy: {position.Accuracy}";
      output += "\n" + $"Altitude: {position.Altitude}";
      output += "\n" + $"Altitude Accuracy: {position.AltitudeAccuracy}";
      Debug.WriteLine(output);
    } 
    
    private void PositionError(object sender, PositionErrorEventArgs e)
    {
      Debug.WriteLine(e.Error);
      //Handle event here for errors
    } 
    
    async Task StopListening()
    {
        if(!CrossGeolocator.Current.IsListening)
            return;
        
      await CrossGeolocator.Current.StopListening);
    
      CrossGeolocator.Current.PositionChanged -= PositionChanged;
      CrossGeolocator.Current.PositionError -= PositionError;
    }
    

    Respondida el Dec 20, 2020 a las 16:42 - por pythonpirate

    Votos positivos: 0 | Votos negativos: 0

  • Para obtener la ubicación actual en tiempo real en Xamarin.Forms, puedes utilizar la clase Geolocator que proporciona acceso a servicios de ubicación en dispositivos móviles. Aquí te dejo un ejemplo de cómo puedes modificar tu código para poder obtener la ubicación en cada fotograma (frame) de la aplicación:

    • Primero, asegúrate de agregar los permisos de ubicación en el archivo `AndroidManifest.xml` y en `Info.plist` para Android y iOS respectivamente.
    • Utiliza la clase `Geolocator` para suscribirte a cambios en la ubicación. Aquí te dejo un ejemplo de cómo modificar tu método `GetCurrentLocation`:
    c

    public async Task GetCurrentLocation()

    { var locator = CrossGeolocator.Current; locator.DesiredAccuracy = 50; locator.PositionChanged += async (sender, e) => { var location = e.Position; Console.WriteLine($"Latitude: {location.Latitude}, Longitude: {location.Longitude}, Altitude: {location.Altitude}"); // Aquí puedes actualizar el mapa en tiempo real si es necesario // map.MoveToRegion(MapSpan.FromCenterAndRadius(new Position(location.Latitude, location.Longitude), Distance.FromMeters(100))); }; if (!locator.IsListening) { await locator.StartListeningAsync(TimeSpan.FromSeconds(10), 5); // Actualiza la ubicación cada 10 segundos o 5 metros } var currentLocation = await locator.GetLastKnownLocationAsync(); return currentLocation; }
    • Llama a la función `GetCurrentLocation` en tu código para empezar a recibir actualizaciones en tiempo real de la ubicación.

    Es importante tener en cuenta que este código podría variar dependiendo de la versión de Xamarin.Forms y las configuraciones específicas de la plataforma que estés utilizando. No olvides gestionar adecuadamente los permisos de ubicación en cada plataforma.

    Espero que esta información te sea de ayuda para obtener la ubicación actual en cada frame de la aplicación en Xamarin.Forms.

    Respondida el Dec 21, 2020 a las 16:45 - por Gpt

    Votos positivos: 0 | Votos negativos: 0

  • Para obtener tu posición actual cada fotograma en Xamarin.Forms, puedes utilizar el evento LocationChanged de la clase Geolocation. Este evento se activa cada vez que cambia la ubicación del dispositivo.

    A continuación se muestra cómo puedes utilizar el evento LocationChanged para obtener tu posición actual cada fotograma:

    csharp
    Geolocation.LocationChanged += Geolocation_LocationChanged;
    
    private void Geolocation_LocationChanged(object sender, LocationChangedEventArgs e)
    {
        var location = e.Location;
    
        // Aquí puedes utilizar la ubicación actual
        Console.WriteLine($"Latitude: {location.Latitude}, Longitude: {location.Longitude}");
    }
    

    Ten en cuenta que debes asegurarte de eliminar el controlador de eventos LocationChanged cuando ya no lo necesites para evitar fugas de memoria. Puedes hacer esto en el método OnDestroy() de tu actividad o página.

    Además, asegúrate de solicitar el permiso ACCESS_FINE_LOCATION en el manifiesto de Android para que tu aplicación pueda acceder a la ubicación del dispositivo.

    Respondida el Dec 21, 2020 a las 16:55 - por Gemini

    Votos positivos: 0 | Votos negativos: 0