Windows アプリ SDK (WinUI 3) アプリでデバイスの地理的位置を検出するには、Windows.Devices.Geolocation API を使用します。 1 回限りの場所の修正プログラムを取得したり、時間の経過と同時にユーザーの位置を追跡したりすることができます。 この記事では、アクセス許可の処理、1 回限りの継続的な場所の読み取り、場所が変更されたときに UI を更新する方法について説明します。
Note
Windows.Devices.Geolocation API は、UWP と WinUI 3 の両方のデスクトップ アプリで動作する Windows ランタイム (WinRT) API です。 この記事のコードでは、WinUI 3 パターン (スレッド マーシャリングの DispatcherQueue など) を使用します。
前提条件
- Blank App, Packaged (WinUI 3 in Desktop)テンプレートから作成された WinUI 3 プロジェクト。
- パッケージ マニフェストで宣言されている Location 機能 ( 場所機能の有効化を参照)。
位置情報機能を有効にする
ユーザーの位置にアクセスするには、アプリで Location 機能を宣言する必要があります。
- ソリューション エクスプローラーで、[Package.appxmanifest] をダブルクリックし、[機能] タブを選択します。
- [場所] チェック ボックスをオンにします。
これにより、マニフェストに次のエントリが追加されます。
<Capabilities>
<DeviceCapability Name="location"/>
</Capabilities>
Tip
パッケージ化されていないアプリの場合、マニフェストで Location 機能は必要ありません。 ただし、引き続き RequestAccessAsync を呼び出して、ユーザーにアクセス許可を求める必要があります。
現在の場所を取得する
1 回限りの位置読み取りを実行するには、次の手順に従います。
ユーザーの場所へのアクセスを要求する
位置情報データにアクセスする前に 、Geolocator.RequestAccessAsync を呼び出します。 このメソッドは、初回実行時にユーザーにアクセス許可を求めます。 アプリがフォアグラウンドにある間は、UI スレッドから呼び出す必要があります。
using Windows.Devices.Geolocation;
var accessStatus = await Geolocator.RequestAccessAsync();
位置を読み取る
ユーザーがアクセス許可を付与する場合は、 Geolocator を作成し、 GetGeopositionAsync を呼び出して 1 回限りの位置修正を取得します。
switch (accessStatus)
{
case GeolocationAccessStatus.Allowed:
var geolocator = new Geolocator { DesiredAccuracyInMeters = 50 };
Geoposition position = await geolocator.GetGeopositionAsync();
double latitude = position.Coordinate.Point.Position.Latitude;
double longitude = position.Coordinate.Point.Position.Longitude;
StatusText.Text = $"Location: {latitude:F4}, {longitude:F4}";
break;
case GeolocationAccessStatus.Denied:
StatusText.Text = "Location access is denied.";
break;
case GeolocationAccessStatus.Unspecified:
StatusText.Text = "An unspecified error occurred.";
break;
}
時間の経過と同時にユーザーの場所を追跡する
定期的な場所の更新を受信するには、 PositionChanged イベントをサブスクライブします。 時間ベースの追跡には ReportInterval を設定し、距離ベースの追跡には MovementThreshold を設定します。
if (accessStatus == GeolocationAccessStatus.Allowed)
{
var geolocator = new Geolocator { ReportInterval = 2000 }; // 2-second interval
geolocator.PositionChanged += OnPositionChanged;
geolocator.StatusChanged += OnStatusChanged;
}
位置の更新を処理する
PositionChanged イベントは、バックグラウンド スレッドで発生します。
DispatcherQueueを使用して、UI の更新をメイン スレッドにマーシャリングします。
private void OnPositionChanged(Geolocator sender, PositionChangedEventArgs args)
{
DispatcherQueue.TryEnqueue(() =>
{
var position = args.Position.Coordinate.Point.Position;
StatusText.Text = $"Updated: {position.Latitude:F4}, {position.Longitude:F4}";
});
}
状態の変更を処理する
StatusChanged を監視して、ユーザーが位置情報サービスを無効にしたとき、または GPS 信号が失われた場合を検出します。
private void OnStatusChanged(Geolocator sender, StatusChangedEventArgs args)
{
DispatcherQueue.TryEnqueue(() =>
{
switch (args.Status)
{
case PositionStatus.Ready:
StatusText.Text = "Location is available.";
break;
case PositionStatus.Disabled:
StatusText.Text = "Location is disabled. Check Settings.";
break;
case PositionStatus.NoData:
StatusText.Text = "Unable to determine location.";
break;
case PositionStatus.NotAvailable:
StatusText.Text = "Location is not available on this device.";
break;
}
});
}
ユーザーを場所の設定に誘導する
ユーザーが位置情報へのアクセスを拒否した場合は、Windowsのプライバシー設定へのリンクを指定して、ユーザーの設定を変更できるようにします。
<HyperlinkButton Content="Open location settings"
NavigateUri="ms-settings:privacy-location" />
コードから設定ページを開くこともできます。
await Windows.System.Launcher.LaunchUriAsync(new Uri("ms-settings:privacy-location"));
マップ上の場所を表示する
位置を取得した後、そのを設定し、Centerを追加することで、WinUI 3 MapIcon に表示できます。 位置情報、マップの表示、ジオフェンシングを組み合わせた完全な作業例については、「 マップと場所の概要」を参照してください。
Troubleshooting
アプリで場所を取得できない場合は、[ 設定] > [プライバシーとセキュリティ] > 場所で次のことを確認します。
- 位置情報サービスがオンになっています。
- アプリが一覧表示され、[アプリが位置情報にアクセスできるようにする] で [オン] に設定されます。
- デバイスに正常に動作するGPS受信機があるか、またはネットワークベースの位置情報取得が利用可能である。
関連資料
Windows developer