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

results matching ""

    No results matching ""