2016-06-20 60 views
0

我正在寫一個Xamarin.Forms PCL應用程序,以支持我的應用程序的iOS和Android操作系統。如何使用Xamarin.Forms和GoogleMaps/GeoLocation

在根項目中,我有一個包含ViewList和一個映射(來自Xamarin.Forms.Maps)的視圖。

我瞭解到我必須爲每個平臺使用CustomRenderer來添加自定義行爲。我試圖通過GPS添加一個LocationManager/GeoLocation來識別用戶位置,並用一個pin/marker顯示他的位置。除此之外,我還從幾個人的根項目中獲得位置信息,這些信息也必須顯示在地圖中。

我是否必須使用接口導出功能或使用適當的自定義地圖渲染器?

我不知道要做到這一點,Xamarin.Forms網站上的示例和Stackoverflow中的研究都沒有給出提示。

下面是一些代碼,我至今(摘錄):

using System; 
using Awesome; 
using Xamarin.Forms; 
using Xamarin.Forms.Maps; 
using System.Collections.ObjectModel; 
using System.Collections.Generic; 
using Plugin.Geolocator; 
using System.Threading.Tasks; 

namespace KiLa 
{ 
    public class KidsFinder : ContentPage, ITabPage 
    { 
     public string TabIcon => FontAwesome.FAMapMarker; 
     public string SelectedTabIcon => FontAwesome.FAMapMarker; 
     private Boolean _showKidsList; 
     private ListView _listView; 
     public ObservableCollection<KidsViewModel> kidsList = new ObservableCollection<KidsViewModel>(); 

     public KidsFinder() 
     { 

      Title = "KidsFinder"; 
      // Define listView 

      // Any near/identified kids? Mockup 
      // TODO: get real data 
      Boolean kidsPresent = true; 

      // Initial height of map 
      double mapHeight = 300.0; 

      // coordinates of Beuth Hochschule, Haus Gauss 
      double latitude = 52.543100; 
      double longitude = 13.351450; 

      // Show/hide kidsList (listView) 
      //Boolean showKidsList = false; 
      _showKidsList = false; 

      // Define toggleButton 
      Button toggleButton = new Button(); 
      toggleButton.Text = "Verstecke Liste"; 

      toggleButton.Clicked += new EventHandler(OnClickEvent); 

      if(kidsPresent == true) 
      { 
       toggleButton.IsVisible = true; 
       mapHeight = 200.0; 
       _showKidsList = true; 
      } else 
       { 
        toggleButton.IsVisible = false; 
        mapHeight = 300.0; 
        _showKidsList = false; 
       } 

      // Mockup some kids 
      Position pos1 = new Position(latitude + 0.002, longitude + 0.002); 
      Position pos2 = new Position (latitude - 0.002, longitude - 0.002); 
      kidsList.Add(new KidsViewModel{Name="Tim", ActualPositon=pos1, DistanceToEducator=5.4}); 
      kidsList.Add(new KidsViewModel{Name="Sabine", ActualPositon=pos2, DistanceToEducator=20.4}); 

      _listView = new ListView(); 
      _listView.ItemsSource = kidsList; 
      //listView.VerticalOptions = LayoutOptions.FillAndExpand; 
      _listView.ItemTemplate = new DataTemplate (typeof(KidsCustomCell)); 
      _listView.RowHeight = 50; 

      if (_showKidsList == false) { 
       _listView.IsVisible = false; 
      } else { 
       _listView.IsVisible = true; 
      } 

      // Define mapView 
      var kidsMap = new KidsMap(); 
      kidsMap.MapType = MapType.Street; 
      kidsMap.WidthRequest = 960; 
      kidsMap.HeightRequest = mapHeight; 
      kidsMap.MoveToRegion(MapSpan.FromCenterAndRadius(new Position(latitude,longitude), Distance.FromMiles(0.3))); 

      // Set label of pins with kids names, 
      foreach (KidsViewModel kvm in kidsList) { 
       Pin pin = new Pin() { 
        Label = kvm.Name, 
        Position = kvm.ActualPositon 
       }; 
        kidsMap.Pins.Add(pin); 
      } 

回答

0

您應該使用GetLocation並聲明必須使用LocationServices

[assembly: UsesPermission(Manifest.Permission.AccessFineLocation)] 
[assembly: UsesPermission(Manifest.Permission.AccessCoarseLocation)] 

這不是絕對必要的獲取權限該設備的GPS座標,但此示例將嘗試爲當前位置提供街道地址:

[assembly: UsesPermission(Manifest.Permission.Internet)] 

添加一個名爲InitializeLocationManager方法來活動

void InitializeLocationManager() 
{ 
_locationManager = (LocationManager) GetSystemService(LocationService); 
Criteria criteriaForLocationService = new Criteria 
{ 
Accuracy = Accuracy.Fine 
}; 
IList<string> acceptableLocationProviders = _locationManager.GetProviders(criteriaForLocationService, true); 

if (acceptableLocationProviders.Any()) 
{ 
_locationProvider = acceptableLocationProviders.First(); 
} 
else 
{ 
_locationProvider = string.Empty; 
} 
Log.Debug(TAG, "Using " + _locationProvider + "."); 
} 

的的LocationManager類將偵聽來自GPS設備更新和事件的方式通知應用程序。在這個例子中,我們要求Android提供與給定的Criteria集匹配的最佳位置提供者,並將該提供者提供給LocationManager。

有關詳細信息如何使用Xamarin形式獲取當前位置,請點擊此鏈接:https://developer.xamarin.com/recipes/android/os_device_resources/gps/get_current_device_location/

+0

謝謝您的回答。你說的URL我已經試過了。但是我的代碼無法獲取用戶設備的當前位置。當我運行代碼時,代碼'_currentLocation = _locationManager.GetLastKnownLocation(_locationProvider);' 引發一個空指針。如果沒有最後的已知位置,我如何獲得當前位置? 「OnLocationChanged」只會在用戶改變他的位置時被調用,但不會獲得他的第一個位置(在初始化時)。 – Pille

+0

更新:看起來,「OnLocationChanged」永遠不會被調用,儘管我將「RequestUpdate」的距離改爲0米。 – Pille