Xamarin 位置缓存是如何工作的?
我有一个应用程序,可以在用户每次填写表单时获取设备的GPS位置。我的问题是捕获GPS位置花费的时间太长。捕获GPS大约需要40秒到60秒。我正在使用jamesmontemagno的地理定位插件 GPS参数: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
精度: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;
}
以下是我的问题:
我强烈建议大家仔细研究一下这个插件,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应该是类似的。