2016-09-26 45 views
0

我正在開發與andorid,UWP和Windows 8項目的Xamarin表單應用程序。我正在使用Jamesmontemagno創建的Geolocation插件來獲取當前設備位置。它在Windows 8和UWP中工作正常,但每當我嘗試運行它對Android設備時,我不斷收到任務取消異常。我已根據建議檢查了所需的所有權限,但仍然沒有運氣。我的代碼訪問的位置低於Xamarin格式地理定位任務取消異常

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; 
       } 
      } 
     } 

下面是我設置的Android清單 enter image description here

+0

你試圖使用的await關鍵字?像這裏:https://github.com/jamesmontemagno/GeolocatorPlugin – Radinator

+0

你測試什麼設備?像魅族這樣的一些Android設備存在問題,導致這種異常。嘗試重新啓動您的手機 – Greensy

+0

@Radinator我一直在與任務工作了這麼久,但從來沒有想過,等待會修復它得到它的工作終於請改變你的評論,以便我可以接受它的答案我會發布的工作解決方案也 –

回答

0

感謝的圖像@Radinator以下是可行的解決方案。就像是在original code使用

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; 
       } 
      } 
     } 
2

嘗試使用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

2

對於任何其他人,即使在await時也只是在Android上,即使該設備的Google地圖應用正常工作,您也可能會遇到this bug,這種情況只發生在某些Android設備上,但只有少數他們在那。

這個問題是Google從未解決的問題。該解決方案以及Google地圖應用正常運行的一個可能原因是使用Google Play服務的融合位置提供商。

目前Geolocator插件只是使用常規Android位置提供程序,但James提到他想在某個時候使用Fused提供程序。我還沒有嘗試融合的提供者。

0

面對v3.0.4中的'Task killed'問題。以下爲我工作:

  1. 卸載的應用
  2. 更新Geolocator搶鮮4.0