Xamarin.Forms で位置情報を普通に取得しようとした場合、プラットフォームごとの実装が必要になってきます。
それではちょっと敷居が高いので、各プラットフォーム共通で動作するプラグインを使ってみることにしました。
ソースコード
位置情報の更新があった場合に、値を更新するサンプルです。
まずは usign を追加します。
using Plugin.Geolocator;
続いて初期化をします。
private void SetGeolocator() { try { var locator = CrossGeolocator.Current; locator.DesiredAccuracy = 50; locator.PositionChanged += Locator_PositionChanged; } catch (Exception) { throw; } }
ボタンクリックとか、フォームロード時とか、適当なタイミングでこの関数を呼ぶようにしましょう。
最後にイベントを定義します。
private void Locator_PositionChanged(object sender, Plugin.Geolocator.Abstractions.PositionEventArgs e) { dat.decValue = (decimal)e.Position.Latitude; }
Positionのプロパティの中に、緯度、経度、高度、速度などの情報が入っています。
プロジェクト設定
ソースコードだけでなく、位置情報を使いますよー と各プラットフォームで宣言する必要があります。
UWP の場合
UWP プロジェクトの Package.appxmanifest を開きます。
続いて 機能 のタブの中の 場所 にチェックを入れます。
Android の場合
Android プロジェクトのプロパティを開きます。
Android マニフェスト のタブの中の ACCESS_COARSE_LOCATION と
ACCESS_FINE_LOCATION にチェックを入れます。
ビルドエラー
このプラグインを入れると Androidプロジェクトのビルドが通らなくなるようですね。
MainApplication.cs の [Application] 属性を外すことで対応しました。
以下のサイトを参考に対応しました。
[Xamarin.Forms] 「"GenerateJavaStubs" タスクが予期せずに失敗しました。」というビルドエラーが発生 - Qiita
と、ここまで書きましたが、まだ実機では試せてなかったりします…
間違ってたら訂正しますね。