Xamarin form Задача геолокации отменена, исключение
Я работаю над приложением Xamarin form с проектом andorid, UWP и Windows 8. Я использую плагин Geolocation, созданный Jamesmontemagno, чтобы получить текущее местоположение устройства. Он отлично работает в Windows 8 и UWP, но всякий раз, когда я пытаюсь запустить его на устройстве Android, я получаю исключение отменено задание. Я проверил все разрешения, которые требуются согласно предложению, но все еще не повезло. Мой код для доступа к местоположению ниже
protected override void OnAppearing()
{
var locator = CrossGeolocator.Current;
locator.DesiredAccuracy = 100; //100 is new default
if (locator.IsGeolocationAvailable && locator.IsGeolocationEnabled)
{
try
{
var position = locator.GetPositionAsync(timeoutMilliseconds: 60000).Result;
//var pp = helper.Setting.Location;
var Latitude = position.Latitude;
var Longitude = position.Longitude;
}
catch(Exception ex)
{
var exc = ex;
}
}
}
4 ответа
Благодаря @Radinator ниже находится рабочее решение.
protected async override void OnAppearing()
{
var locator = CrossGeolocator.Current;
locator.DesiredAccuracy = 100; //100 is new default
if (locator.IsGeolocationAvailable && locator.IsGeolocationEnabled)
{
try
{
await SetLocation();
}
catch (Exception ex)
{
var exc = ex;
}
}
}
private async Task SetLocation()
{
var locator = CrossGeolocator.Current;
locator.DesiredAccuracy = 100; //100 is new default
if (locator.IsGeolocationAvailable && locator.IsGeolocationEnabled)
{
try
{
var position = await locator.GetPositionAsync(timeoutMilliseconds: 60000);
var Latitude = position.Latitude;
var Longitude = position.Longitude;
}
catch (Exception ex)
{
//log ex;
throw ex;
}
}
}
Попробуйте использовать await
ключевое слово как оно используется в оригинальном коде:
try
{
var locator = CrossGeolocator.Current;
locator.DesiredAccuracy = 50;
var position = await locator.GetPositionAsync (timeoutMilliseconds: 10000);
Console.WriteLine ("Position Status: {0}", position.Timestamp);
Console.WriteLine ("Position Latitude: {0}", position.Latitude);
Console.WriteLine ("Position Longitude: {0}", position.Longitude);
}
catch(Exception ex)
{
Debug.WriteLine("Unable to get location, may need to increase timeout: " + ex);
}
Это должно позаботиться о том, что нет расы и, следовательно, TaskCancellationException
,
Для тех, кто получает тайм-аут даже с await
, только на Android, и хотя приложение Google Maps на устройстве работает нормально, вы, вероятно, сталкиваетесь с этой ошибкой, которая возникает только на определенных устройствах Android, но при этом их довольно много.
Проблема старая, которую Google никогда не исправлял. Решение, и одна из возможных причин, по которой приложение Google Maps работает нормально, заключается в том, чтобы использовать надежный сервис определения местоположения Google Play Services.
В настоящее время плагин Geolocator просто использует обычный поставщик местоположения Android, но Джеймс упомянул, что он хотел бы использовать поставщика Fused в какой-то момент. Я все же должен попробовать сам проваленный провайдер.
Столкнулся с проблемой "Задача убита" с v3.0.4. Следующее работало для меня:
- Удалить приложение
- Обновите Geolocator до предварительной версии 4.0