Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/xamarin/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Xamarin 位置缓存是如何工作的?_Xamarin_Xamarin.forms_Xamarin.android_Geolocation - Fatal编程技术网

Xamarin 位置缓存是如何工作的?

Xamarin 位置缓存是如何工作的?,xamarin,xamarin.forms,xamarin.android,geolocation,Xamarin,Xamarin.forms,Xamarin.android,Geolocation,我有一个应用程序,可以在用户每次填写表单时获取设备的GPS位置。我的问题是捕获GPS位置花费的时间太长。捕获GPS大约需要40秒到60秒。我正在使用jamesmontemagno的地理定位插件 GPS参数: 精度:100米 超时:1分钟 下面是我现在正在使用的代码: var defaultgpsaccuracy = Convert.ToDouble(Preferences.Get("gpsaccuracy", String.Empty, "private_prefs")); var defaul

我有一个应用程序,可以在用户每次填写表单时获取设备的GPS位置。我的问题是捕获GPS位置花费的时间太长。捕获GPS大约需要40秒到60秒。我正在使用jamesmontemagno的地理定位插件

GPS参数:
精度:100米
超时:1分钟

下面是我现在正在使用的代码:

var defaultgpsaccuracy = Convert.ToDouble(Preferences.Get("gpsaccuracy", String.Empty, "private_prefs"));
var defaultgpstimeout = Convert.ToDouble(Preferences.Get("gpstimeout", String.Empty, "private_prefs"));

var locator = CrossGeolocator.Current;
locator.DesiredAccuracy = defaultgpsaccuracy;

position = await locator.GetLastKnownLocationAsync();

if (position != null)
{
     string location = position.Latitude + "," + position.Longitude;
     lblStartLocation.Text = location;
}
else
{
     position = await locator.GetPositionAsync(TimeSpan.FromMinutes(defaultgpstimeout), null, false);

     string location = position.Latitude + "," + position.Longitude;
     lblStartLocation.Text = location;
}
以下是我的问题:

  • 我使用了locator.GetLastKnownLocationAsync()位置缓存刷新前多长时间
  • 当位置发生变化时,最后一个已知位置是否会刷新
  • 当设备超出精度范围(例如,精度为100米)时,位置是否刷新当设备超出最后已知位置的100米范围时,位置缓存是否刷新

  • 我强烈建议大家仔细研究一下这个插件,James Montemagno是我的Microsoft在Xamarin框架上工作的一位知名的、受人尊敬的开发人员,因此他的插件、扩展和工具包往往经过高度优化,可用于跨平台应用程序

    从文档中可以清楚地看出,尝试获取最后一个“已知”位置会查看内部缓存的位置数据集,并且不一定针对近实时查询进行优化。但是,它可以用来减少你必须在应用程序中进行的实际位置查询的数量

    链接文档的完整片段如下所示:

    public async Task<Position> GetCurrentLocation()
    {
       public static async Task<Position> GetCurrentPosition()
        {
                Position position = null;
                try
                {
                        var locator = CrossGeolocator.Current;
                        locator.DesiredAccuracy = 100;
    
                        position = await locator.GetLastKnownLocationAsync();
    
                        if (position != null)
                        {
                                //got a cahched position, so let's use it.
                                return position;
                        }
    
                        if (!locator.IsGeolocationAvailable || !locator.IsGeolocationEnabled)
                        {
                                //not available or enabled
                                return null;
                        }
    
                        position = await locator.GetPositionAsync(TimeSpan.FromSeconds(20), null, true);
    
                }
                catch (Exception ex)
                {
                        Debug.WriteLine("Unable to get location: " + ex);
                }
    
                if (position == null)
                        return null;
    
                var output = string.Format("Time: {0} \nLat: {1} \nLong: {2} \nAltitude: {3} \nAltitude Accuracy: {4} \nAccuracy: {5} \nHeading: {6} \nSpeed: {7}",
                        position.Timestamp, position.Latitude, position.Longitude,
                        position.Altitude, position.AltitudeAccuracy, position.Accuracy, position.Heading, position.Speed);
    
                Debug.WriteLine(output);
    
                return position;
        }
    }
    
    公共异步任务GetCurrentLocation() { 公共静态异步任务GetCurrentPosition() { 位置=空; 尝试 { var定位器=CrossGeolocator.Current; locator.DesiredAccuracy=100; 位置=等待定位器。GetLastKnownLocationAsync(); 如果(位置!=null) { //有一个cahched位置,所以让我们使用它。 返回位置; } 如果(!locator.IsGeolocationAvailable | |!locator.IsGeolocationEnabled) { //不可用或未启用 返回null; } position=await locator.GetPositionAsync(TimeSpan.FromSeconds(20),null,true); } 捕获(例外情况除外) { Debug.WriteLine(“无法获取位置:+ex”); } 如果(位置==null) 返回null; var output=string.Format(“时间:{0}\nLat:{1}\nLong:{2}\nAltitude:{3}\nAltitude精度:{4}\n精度:{5}\n读取:{6}\n种子:{7}”, 位置,时间戳,位置,纬度,位置,经度, 位置。高度,位置。高度准确度,位置。准确度,位置。航向,位置。速度); Debug.WriteLine(输出); 返回位置; } } 此方法旨在遵循位置检索的分层模式,它从最后一个“已知”位置开始,并在必要时进行查询,您还可以进一步执行此操作,并在需要时添加超时以检查缓存位置

    关于这些数据的刷新频率,我建议您参考

    James以驾驶应用程序为例介绍了其工作原理。Android和iOS对刷新的处理方式不同,但以下是有关Android的片段:

    为此,您需要集成一个前台服务 订阅位置更改,用户界面绑定到。请 通读


    在他使用的代码示例中,他向您展示了如何创建一个“侦听器”,定期检查位置的更改。根据应用程序的目的,这可能更适合您正在尝试做的事情。

    如果您在项目中提出问题,可能会得到更好的回答。FWIW,该项目的发展似乎已经放缓。您的问题可以通过切换到并使用零件来解决。如果我记得的话,它实际上是James项目,所以API应该是类似的。