ユーザーの位置情報の取得

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 機能を宣言する必要があります。

  1. ソリューション エクスプローラーで、[Package.appxmanifest] をダブルクリックし、[機能] タブを選択します。
  2. [場所] チェック ボックスをオンにします。

これにより、マニフェストに次のエントリが追加されます。

<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受信機があるか、またはネットワークベースの位置情報取得が利用可能である。