GPS - Get Location

在Xamarin 使用 GPS 定位功能

nuget : Xam.Plugin.Geolocator


nuget : Plugin.Permissions

在ProjectName.Android 設定 AndroidManifest.xml

<uses-permission android:name="android.permission.ACCESS_COARSE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_FINE_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_LOCATION_EXTRA_COMMANDS" />
<uses-permission android:name="android.permission.ACCESS_MOCK_LOCATION" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

在 ProjectName 建立 XAML 
目的:當按下 Button 開啟定位,並將座標與時間呈列Label

<StackLayout>
  <Label x:Name="labLocation" Text=""
         VerticalOptions="CenterAndExpand"
         HorizontalOptions="CenterAndExpand" />
  <Button x:Name="btnLocation" Text="start GPS" Clicked="getLocation_Clicked" ></Button>
</StackLayout>

在 ProjectName XAML.cs

bool isListen = false;

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 position = e.Position;
    labLocation.Text += $"{position.Timestamp.ToString("yyyy-MM-dd HH:mm:ss")} => {position.Latitude.ToString("F6")} {position.Longitude.ToString("F6")} \n";
  });
}

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