2016-06-20 2 views
0

내 응용 프로그램 용 iOS 및 Android OS를 지원하는 Xamarin.Forms PCL 앱을 작성하고 있습니다.Xamarin.Forms 및 GoogleMaps/GeoLocation 사용 방법

루트 프로젝트에는 ViewList와지도 (Xamarin.Forms.Maps)가 포함 된보기가 있습니다.

나는 맞춤 동작을 추가하기 위해 각 플랫폼마다 CustomRenderer를 사용해야한다는 것을 알게되었습니다. LocationManager/GeoLocation을 추가하여 GPS를 통해 사용자 위치를 식별하고 핀/마커로 자신의 위치를 ​​표시하려고합니다. 또한 필자는 몇몇 사람들의 루트 프로젝트에서지도를 보여 주어야한다.

기능을 내보내는 인터페이스를 사용해야하거나 적절한 사용자 정의 맵 렌더러를 사용해야합니까?

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 좌표이지만이 예에서는 현재 위치의 번지를 제공하려고 시도합니다.

(3210)는을 locationManager 클래스는 장치에서 GPS 업데이트를 수신하고 이벤트의 방법으로 응용 프로그램을 통지 할 것입니다 활동

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 + "."); 
} 

에 InitializeLocationManager라는 메소드를 추가합니다. 이 예에서는 주어진 기준 세트와 일치하는 가장 좋은 위치 제공자를 Android에 요청하고 그 제공자를 LocationManager에 제공합니다. 자세한 내용은

방법, 자 마린 양식을 사용하여 현재 위치를 얻을이 링크를 다음과 같이하십시오

+0

https://developer.xamarin.com/recipes/android/os_device_resources/gps/get_current_device_location/이 답변 주셔서 감사합니다. 이미 시도한 URL입니다. 하지만 내 코드는 사용자 장치의 현재 위치를 가져올 수 없습니다. 코드를 실행할 때 코드 '_currentLocation = _locationManager.GetLastKnownLocation (_locationProvider);' null 포인터를 throw합니다. 마지막으로 알려진 위치가없는 경우 어떻게 현재 위치를 얻습니까? "OnLocationChanged"는 사용자가 자신의 위치를 ​​변경하는 경우에만 호출되지만 초기화시 첫 번째 위치는 가져 오지 않습니다. – Pille

+0

업데이트 : "OnLocationChanged"가 호출 된 적이 없기 때문에 "RequestUpdate"로 거리를 0 미터로 변경했습니다. – Pille