在我的Windows Phone 8应用中,我尝试在主页面上使用GetGeopositionAsync根据用户位置显示一些项目。
调用GetGeopositionAsync不会在指定的超时内返回,它根本不会返回。
我使用的代码很简单:
Geolocator geolocator = new Geolocator();
geolocator.DesiredAccuracyInMeters = 50;
Geoposition geoposition = null;
try
{
geoposition = await geolocator.GetGeopositionAsync(
maximumAge: TimeSpan.FromMinutes(5),
timeout: TimeSpan.FromSeconds(10));
}
catch (UnauthorizedAccessException ex)
{
// location services disabled or other error
// user should setup his location
}
我能找到的解决方案是为GeoCoordinateWatcher创建一个异步包装器,它似乎工作正常。 但我对我的解决方案不太自信,我更愿意使用GetGeopositionAsync,它看起来像是在WP8中获取设备位置的推荐方法。
更新:其他人报告的行为相同: http://social.msdn.microsoft.com/forums/en-us/wpdevelop/thread/ff166fac-b423-4428-abd8-610bf0102fc0
答案 0 :(得分:5)
您何时调用方法来请求地理位置?当我在ViewModel中调用构造函数的部分时,我发现遇到了同样的问题。
我能够通过添加OnLoadedCommand并从那里调用方法来修复代码中的问题。从那以后我就没有其他问题了。
答案 1 :(得分:4)
这很奇怪,但GetGeoPositionAsync仅在使用MovementThreshold和/或ReportInterval初始化Geolocator时返回当前位置。
Geolocator geolocator = new Geolocator();
geolocator.DesiredAccuracyInMeters = 50;
geolocator.MovementThreshold = 5;
geolocator.ReportInterval = 500;
Geoposition geoposition = null;
try
{
geoposition = await geolocator.GetGeopositionAsync(
maximumAge: TimeSpan.FromMinutes(5),
timeout: TimeSpan.FromSeconds(10));
}
catch (UnauthorizedAccessException ex)
{
// location services disabled or other error
// user should setup his location
}
答案 2 :(得分:2)
我在设备上测试时遇到了这个问题。我必须在设备上禁用WiFi才能使其正常工作。我知道有些人在模拟器上遇到了相反的问题。我没有做任何包装。希望它有助于
答案 3 :(得分:1)
我发现了一件事。如果我将精度设置为更大的精度,那么geolocator会启动返回坐标。所以它不能工作50米,但工作500,所以尝试使用下面的行。
geolocator.DesiredAccuracyInMeters = 500;
答案 4 :(得分:0)
我上面遇到了一些相同的问题。当我连接到geolocator.StatusChanged事件时,我注意到事件序列是:
所以我在等待电话之前添加了一个循环:
while (geolocator.LocationStatus == PositionStatus.Initializing)
{
System.Threading.Thread.Sleep(100);
}
这不太优雅,但确实有效。
答案 5 :(得分:0)
当调用geolocator
时NotInitialized
的状态为GetGeopositionAsync()
状态时,会发生这种奇怪的行为。
geolocator
在两种情况下仅为Ready
。一,当它订阅PositionChanged
事件时。二,当已经调用GetGeopositionAsync()
时。
因此,您只需在调用geolocator
之前订阅positionChanged
到GetGeopositionAsync()
个事件。
希望这有帮助。
答案 6 :(得分:0)
我发现如果您在本地创建了Geolocator,该任务最终会被取消。它在我创建永久Geolocator实例时有效。
答案 7 :(得分:0)
看我的样本: http://code.msdn.microsoft.com/windowsapps/How-to-use-Cimbalino-3888977e
它使用MVVM& Cimbalino工具包!
在我的情况下,我设置ReportInterval = 5来解决这个问题。
答案 8 :(得分:0)
看起来好像每个人都被砍掉了,直到它起作用......这对我有用:
/// <summary>
/// HACK: For some reason Geolocator.GetGeopositionAsync hangs indefinitely.
/// The workaround is to add a PositionChanged handler.
/// </summary>
private Geoposition GetGeoposition()
{
var geolocator = new Geolocator();
var semaphoreHeldUntilPositionReady = new SemaphoreSlim(initialCount: 0);
Geoposition position = null;
geolocator.ReportInterval = 1000;
geolocator.PositionChanged += (sender, args) =>
{
position = args.Position;
semaphoreHeldUntilPositionReady.Release();
};
semaphoreHeldUntilPositionReady.Wait();
return position;
}
答案 9 :(得分:-3)
我知道这有点老了,但我希望其他人在搜索这个主题时觉得这个答案很有帮助。
在尝试访问位置服务之前,请务必征得用户的同意。
我遇到了这个问题,但是在打开页面时调用OnNavigatedTo事件以获得他们的同意来修复它。
protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
{
if (IsolatedStorageSettings.ApplicationSettings.Contains("LocationConsent"))
{
// User has opted in or out of Location
return;
}
else
{
MessageBoxResult result =
MessageBox.Show("This app accesses your phone's location. Is that ok?",
"Location",
MessageBoxButton.OKCancel);
if (result == MessageBoxResult.OK)
{
IsolatedStorageSettings.ApplicationSettings["LocationConsent"] = true;
}else
{
IsolatedStorageSettings.ApplicationSettings["LocationConsent"] = false;
}
IsolatedStorageSettings.ApplicationSettings.Save();
}
}