【问题标题】:problem updating location every 5 seconds with xamarin essentials使用 xamarin 要点每 5 秒更新一次位置的问题
【发布时间】:2021-10-27 19:52:18
【问题描述】:

我有一个带有 xamarin Essentials 的应用程序。这每 5 秒获取一次信息,GPS 等待时间为 3 秒

 Device.StartTimer(TimeSpan.FromMilliseconds(Timmer), () => { RunPoint(); return isRunningTimer; });

    public async void RunPoint()
    {       try
            {
                DateTime dateLanch = DateTime.Now;
                var request = new GeolocationRequest(accuracy, TimeSpan.FromSeconds(TimeOutGps));
                var location = await Geolocation.GetLocationAsync(request);

                if (location != null)
                {
                    point = new GPSPoint
                    {
                        Status = StatusGPS.OK,
                        Point = new Cerezasoft.Geo.Points.Point { Latitude = location.Latitude, Longitude = location.Longitude },
                        Stamp = location.Timestamp.LocalDateTime,
                        StampSystem = DateTime.Now,
                        StampLanch = dateLanch,
                        StampUniversal = location.Timestamp.UtcDateTime,
                        Speed = 0,
                        SpeedGPS = location.Speed.HasValue ? location.Speed.Value : 0,
                        Elevation = location.Altitude.HasValue ? location.Altitude.Value : 0
                    };
                }
                else
                {
                    point.Status = StatusGPS.ErrorCalculo;
                }
            }
            catch (FeatureNotSupportedException fnsEx)
            {
                point.Status = StatusGPSRallySystem.NoSensor;
                point.MessageError = fnsEx.Message;
            }
            catch (PermissionException pEx)
            {
                point.Status = StatusGPS.NoAcces;
                point.MessageError = pEx.Message;
            }
            catch (Exception ex)
            {
                point.Status = StatusGPS.ErrorSensor;
                point.MessageError = ex.Message;
            }
}

当应用程序与具有 gps 的另一个应用程序一起使用时。 gps 信息的捕获效果很好,但如果您执行数据的精度和质量,位置就会变得不稳定。

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-feature android:name="android.hardware.location" android:required="false" />
<uses-feature android:name="android.hardware.location.gps" android:required="true" />
    protected override void OnCreate(Bundle savedInstanceState)
    {
        base.OnCreate(savedInstanceState);
        global::Xamarin.Forms.Forms.Init(this, savedInstanceState);
        Xamarin.Essentials.Platform.Init(this, savedInstanceState);
    }

我在分屏中与另一个应用程序进行了比较,它运行良好。当我的应用程序单独运行时,操作系统会以不同的方式返回位置。当我的应用程序自行运行时。操作系统返回的位置更不稳定。两个测试都是在相同的地方,相同的条件和相同的手机进行的。我不知道哪些服务和哪些附加元素正在激活其他应用程序以实现 GPS 的最佳运行

感谢合作

【问题讨论】:

  • “如果你执行数据的精度和质量,位置就会变得不稳定” - 我不明白那句话。哪些代码行导致位置不稳定?你所说的“不稳定”是什么意思——你是如何测试的?您是否在室外使用具有良好卫星信号(远离建筑物、树木)的实际设备?哪个设备?显示您获得的实际值序列 - 您认为“不稳定”可能是 gps 的“正常行为”。手机的天线长度有限,必须平衡精度和电池消耗。它们不是精密 GPS 设备。
  • 就个人而言,我经常进行快速 gps 测量,并对它们应用我自己的过滤器。谷歌搜索,请参阅 this SO threadhere is one good discussion
  • 当您对 Geolocation 进行异步调用时,需要一些时间来轮询传感器以获取基于您设置的参数的值。鉴于您为系统提供的值相对较短,我很惊讶它似乎“不稳定”。如果你真的需要这么快的值,你可能会更好地实现这是一种特定于平台的方式,并订阅每个平台上的位置更新。然后,您可以自己缓冲它们并将不那么不稳定的内容传递回 Xamarin Forms。
  • 我在分屏中与另一个应用程序进行了比较,它运行良好。当我的应用程序单独运行时,操作系统会以不同的方式返回位置。当我的应用程序自行运行时。操作系统返回的位置更不稳定。两个测试都是在相同的地方,相同的条件和相同的手机进行的。我不知道哪些服务和哪些附加元素正在激活其他应用程序以实现 GPS 的最佳功能
  • “我不知道哪些服务和其他元素正在激活其他应用程序以实现 gps 的最佳功能” 我认为其他应用程序已经完成了一些自定义“过滤” ",他们自己的代码,以获得更稳定的结果。 AFAIK,没有任何人可以告诉你的“简单”答案。因此我上面的链接。

标签: xamarin.forms xamarin.essentials


【解决方案1】:

“我在分屏中与另一个应用程序进行比较,它运行良好。当我的应用程序单独运行时,操作系统以不同的方式返回位置。当我的应用程序自行运行时。操作系统返回位置更不稳定。”

我遇到了与上面解释的完全相同的问题

这是我的代码

locator = CrossGeolocator.Current;
if (locator.IsGeolocationAvailable && locator.IsGeolocationEnabled)
{
    locator.DesiredAccuracy = 10;
    await locator.StartListeningAsync(TimeSpan.FromSeconds(15), 10, false, new Plugin.Geolocator.Abstractions.ListenerSettings()
    {
        AllowBackgroundUpdates = true,
        ActivityType = Plugin.Geolocator.Abstractions.ActivityType.Fitness,
        PauseLocationUpdatesAutomatically = false
    });
    locator.PositionChanged += Postion_Changed;
}

public void Postion_Changed(object sender, Plugin.Geolocator.Abstractions.PositionEventArgs e)
{
    if (e.Position.Accuracy < 75)
    {
       LocationService.SaveGpsLocation(e.Position.Latitude, e.Position.Longitude, e.Position.Timestamp.DateTime);
    }
}

当它与另一个 GPS 应用程序一起运行时,它是精确定位的,但当它单独运行时,它会跳来跳去很多。

我认为其他应用程序已经做了一些自定义“过滤”,他们自己的代码,以获得更稳定的结果。没有任何人可以告诉你的“简单”答案,AFAIK。因此我的链接在上面。 "

这不可能,因为这根本不会影响我们的应用程序。他们只是设法请求一个更好的位置,这反过来又以某种方式帮助我们的应用程序 - 我们只是试图找出原因。

【讨论】:

  • 这并不能真正回答问题。如果您有其他问题,可以点击 提问。要在此问题有新答案时收到通知,您可以follow this question。一旦你有足够的reputation,你也可以add a bounty 来引起对这个问题的更多关注。 - From Review
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-31
  • 1970-01-01
  • 2015-06-22
相关资源
最近更新 更多