2017-01-20 20 views
7

çalışmaz. Ancak, bir OnAppearing geçersiz kılma yönteminin içinde kullanıyorum ve çalışmıyor. GetPositionAsync yöntemi Uygulamayı askıya alır.CrossGeolocator en GetPositionAsync Ben cihazın mevcut enlem ve boylamı almak için <strong>CrossGeolocator</strong> kullanıyorum

protected override void OnAppearing() 
{ 
    base.OnAppearing(); 

    var position = GetPosition().Result; 
    var lat = position.Latitude; 
    var lon = position.Longitude; 
} 

private static async Task<Position> GetPosition() 
{ 
    var locator = CrossGeolocator.Current; 
    locator.DesiredAccuracy = 50; 

    var position = await locator.GetPositionAsync(10000); 
    return position; 
} 

Detay ben uygulamada düğmelerde bu aynı GetPosition yöntemi kullanılarak ve mükemmel çalışıyor olmamız.

Birisi bana bu konuda yardımcı olabilir mi?

cevap

4

bu deneyin:

küresel değişkeni oluşturun:

private Position _position; 

Sonra yapıcı konumunu almak için ur yöntemini çağırın. böyle ur yöntemini yeniden yazma: u bu kullanmak istediğiniz yerde

public async void GetPosition() 
{ 
    var locator = CrossGeolocator.Current; 
    locator.DesiredAccuracy = 50; 
    var myPosition = await locator.GetPositionAsync(); 
    _position = new Position(myPosition.Latitude, myPosition.Longitude); 
} 

Sonra bir süre olun: Bu benim için çalıştı

while(_position == new Postion(0,0)) 
     GetPosition(); 
+0

Teşekkür Ben robot projesini Xamarin kod yukarıda çalıştık ederken çok adam – Danilo

+0

Merhaba, görev iptal istisna alıyorum. – Deepak

1

.

Bağlantıda belirtildiği gibi xamarin form haritaları oluşturun. Eğer bakmak https://jamesmontemagno.github.io/GeolocatorPlugin/CurrentLocation.html

using Plugin.Geolocator; 
using System; 
using Xamarin.Forms; 
using Xamarin.Forms.Maps; 
using Xamarin.Forms.Xaml; 
namespace MapApp 
{ 
    [XamlCompilation(XamlCompilationOptions.Compile)] 
    public partial class MapPage : ContentPage 
    { 
     private Position _position; 
     public MapPage() 
     { 
      InitializeComponent(); 

      var map = new Map(
       MapSpan.FromCenterAndRadius(
         new Position(37, -122), Distance.FromMiles(0.3))) 
      { 
       IsShowingUser = true, 
       HeightRequest = 100, 
       WidthRequest = 960, 
       VerticalOptions = LayoutOptions.FillAndExpand 
      }; 



      if (IsLocationAvailable()) 
      { 
       GetPosition(); 
       map.MoveToRegion(MapSpan.FromCenterAndRadius(_position, Distance.FromMiles(1))); 

      } 

      map.MapType = MapType.Street; 
      var stack = new StackLayout { Spacing = 0 }; 
      stack.Children.Add(map); 
      Content = stack; 

     } 

     public bool IsLocationAvailable() 
     { 
      if (!CrossGeolocator.IsSupported) 
       return false; 

      return CrossGeolocator.Current.IsGeolocationAvailable; 
     } 
     public async void GetPosition() 
     { 
      Plugin.Geolocator.Abstractions.Position position = null; 
      try 
      { 
       var locator = CrossGeolocator.Current; 
       locator.DesiredAccuracy = 100; 

       position = await locator.GetLastKnownLocationAsync(); 

       if (position != null) 
       { 
        _position = new Position(position.Latitude, position.Longitude); 
        //got a cahched position, so let's use it. 
        return; 
       } 

       if (!locator.IsGeolocationAvailable || !locator.IsGeolocationEnabled) 
       { 
        //not available or enabled 
        return; 
       } 

       position = await locator.GetPositionAsync(TimeSpan.FromSeconds(20), null, true); 

      } 
      catch (Exception ex) 
      { 
       throw ex; 
       //Display error as we have timed out or can't get location. 
      } 
      _position = new Position(position.Latitude, position.Longitude); 
      if (position == null) 
       return; 

     } 

    } 
} 
1

Things yararlanabilir linke altına https://jamesmontemagno.github.io/GeolocatorPlugin/GettingStarted.html

belirtilen https://developer.xamarin.com/guides/xamarin-forms/user-interface/map/

izinleri ayarlama olarak kurucusundaki yöntemini çağırarak

olduğunu. Varsa mevcut uzunluğa sahip olabilir. ÇOK IMP, uygulama kilitlenmelerini yakalamadan yakalamayı denedi. Yakalamada herhangi bir şeyi yazmamak, istisna çekmek istemez.

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 

using Foundation; 
using UIKit; 
using System.Threading.Tasks; 
using Plugin.Geolocator.Abstractions; 
using Plugin.Geolocator; 
using System.Diagnostics; 
using Xamarin.Forms; 
using abcde.iOS; 

[assembly: Xamarin.Forms.Dependency(typeof(GPSLocation_iOS))] 

namespace abcde.iOS 
{ 
public class GPSLocation_iOS : IGPSLocation 
{ 
public Position _position; 

    public GPSLocation_iOS() 
    { 
     GetPosition(); 
    } 

    public Dictionary<string, string> GetGPSLocation() 
    { 
    Dictionary<string, string> dictPosition = new Dictionary<string, string>(); 

    dictPosition.Add("latitude", _position.Latitude.ToString()); 
    dictPosition.Add("longitude", _position.Longitude.ToString()); 

     return dictPosition; 
    } 

    public async void GetPosition() 
    { 
     try 
     { 
      var locator = CrossGeolocator.Current; 

      _position = await locator.GetLastKnownLocationAsync(); 

      if (_position == null) 
      { 
     locator.DesiredAccuracy = 50; 
     var myPosition = await locator.GetPositionAsync(); 
     _position = new Position(myPosition.Latitude, myPosition.Longitude); 
      } 
     } 
     catch (Exception ex) 
     { 

     } 
    } 
İlgili konular