Map - 2. Google Map & GPS
nuget : https://www.xamarin.com/forms
在ProjectName.Android 設定 AndroidManifest.xml
<application android:label="Hello.Android" android:icon="@drawable/icon">
<meta-data android:name="com.google.android.maps.v2.API_KEY" android:value="Google Map Key" />
<meta-data android:name="com.google.android.gms.version" android:value="@integer/google_play_services_version" />
</application>
Google Map Key
https://console.cloud.google.com/apis
參考: [https://vulcanlee.gitbooks.io/xamarin-forms/content/chapter5.html](https://vulcanlee.gitbooks.io/xamarin-forms/content/chapter5.html) 取得簽署檔案 SHA1 指紋
在ProjectName.Android 設定 MainActivity.cs
protected override void OnCreate(Bundle bundle)
{
TabLayoutResource = Hello.Droid.Resource.Layout.Tabbar;
ToolbarResource = Hello.Droid.Resource.Layout.Toolbar;
base.OnCreate(bundle);
global::Xamarin.Forms.Forms.Init(this, bundle);
global::Xamarin.FormsMaps.Init(this, bundle);
LoadApplication(new App());
}
在ProjectName 建立 XAML
需參考 xmlns:maps="clr-namespace:Xamarin.Forms.Maps;assembly=Xamarin.Forms.Maps"
<StackLayout>
<maps:Map x:Name="map" VerticalOptions="FillAndExpand"></maps:Map>
<Button x:Name="btnLocation" Text="get Location" Clicked="getLocation_Clicked" ></Button>
</StackLayout>
在ProjectName XAML.cs
bool isListen = false;
public MapMarkerPage ()
{
InitializeComponent ();
map.MoveToRegion(MapSpan.FromCenterAndRadius(new Xamarin.Forms.Maps.Position(23.983116, 120.194861), Distance.FromMeters(500)));
}
private async void getLocation_Clicked(object sender, EventArgs e)
{
if (isListen)
{
await StopListening();
isListen = false;
btnLocation.Text = "start GPS";
}
else
{
await StartListening();
isListen = true;
btnLocation.Text = "stop GPS";
}
}
async Task StartListening()
{
if (CrossGeolocator.Current.IsListening)
return;
await CrossGeolocator.Current.StartListeningAsync(TimeSpan.FromSeconds(10), 500, true);
CrossGeolocator.Current.PositionChanged += PositionChanged;
CrossGeolocator.Current.PositionError += PositionError;
}
private void PositionChanged(object sender, PositionEventArgs e)
{
Device.BeginInvokeOnMainThread(() =>
{
var pos = e.Position;
map.MoveToRegion(MapSpan.FromCenterAndRadius(new Xamarin.Forms.Maps.Position(pos.Latitude, pos.Longitude), Distance.FromMeters(500)));
var pin = new Pin
{
Type = PinType.Place,
Position = position,
Label = "KASE",
Address = ""
};
map.Pins.Add(pin);
});
}
private void PositionError(object sender, PositionErrorEventArgs e)
{
//Handle event here for errors
}
async Task StopListening()
{
if (!CrossGeolocator.Current.IsListening)
return;
await CrossGeolocator.Current.StopListeningAsync();
CrossGeolocator.Current.PositionChanged -= PositionChanged;
CrossGeolocator.Current.PositionError -= PositionError;
}