このトピックでは、ユーザーの位置情報の変更に対応する方法を説明します。

理解しておく必要があること

テクノロジ

  • Windows Runtime

必要条件

HTML と JavaScript について理解している必要があります。

手順

ステップ 1: 位置情報が有効になっていることを確認する

アプリが位置情報にアクセスする前に、デバイスで [位置情報] を有効にする必要があります。設定アプリで、次の位置情報に関するプライバシー設定がオンになっていることを確認します。

  • [このデバイスの位置情報][オン] になっている (Windows 10 Mobile には適用されません)
  • 位置情報サービス設定の [位置情報][オン] になっている
  • [位置情報を使うことができるアプリを選ぶ] で、アプリが [オン] になっている

ステップ 2: Microsoft Visual Studio を開く

[JavaScript/ストア アプリ] のプロジェクトの種類を選び、[空のアプリケーション] を選んで、新しいプロジェクトを作ります。

ステップ 3: 新しいプロジェクトを作る

[新しいプロジェクト] ダイアログ ボックスで、JavaScript のプロジェクトの種類から新しいアプリケーションを選びます。

ステップ 4: 位置情報機能を有効にする

Windows プロジェクトと Windows Phone プロジェクトの両方について、ソリューション エクスプローラーpackage.appxmanifest をダブルクリックし、[機能] タブを選びます。[機能] の一覧で、[位置情報] をオンにします。これにより、Location デバイス機能がパッケージ マニフェスト ファイルに追加されます。

  <Capabilities>
    <!-- DeviceCapability elements must follow Capability elements (if present) -->
    <DeviceCapability Name="location"/>
  </Capabilities>

ステップ 5: JavaScript コードを置き換える

共有プロジェクトで、default.js (/js/default.js) を開きます。ファイル内のコードを次のコードに置き換えます。



(function () {
    "use strict";

    var app = WinJS.Application;
    var activation = Windows.ApplicationModel.Activation;

    app.onactivated = function (args) {
        if (args.detail.kind === activation.ActivationKind.launch) {

            args.setPromise(WinJS.UI.processAll().
                done(function () {

                    // Add an event handler to the button.
                    document.querySelector("#startTracking").addEventListener("click",
                        trackloc);

                    // Add an event handler to the button.
                    document.querySelector("#stopTracking").addEventListener("click",
                        stoptracking);

                }));
        }
    };

    var loc = null;

    function trackloc() {
        if (loc == null) {
            loc = new Windows.Devices.Geolocation.Geolocator();
        }
        if (loc != null) {
            loc.addEventListener("positionchanged", onPositionChanged);
            loc.addEventListener("statuschanged", onStatusChanged);
            // display initial status, in case location is turned off.
            document.getElementById('geolocatorStatus').innerHTML =
                getStatusString(loc.locationStatus);
        }
    }

    function stoptracking() {
        if (loc != null) {
            loc.removeEventListener("positionchanged", onPositionChanged);
        }
    }

    function onPositionChanged(args) {
        var pos = args.position;
        document.getElementById('latitude').innerHTML =
            pos.coordinate.point.position.latitude;
        document.getElementById('longitude').innerHTML =
            pos.coordinate.point.position.longitude;
        document.getElementById('accuracy').innerHTML =
            pos.coordinate.accuracy;
        document.getElementById('geolocatorStatus').innerHTML =
                getStatusString(loc.locationStatus);
    }

    // Handle change in status to display an appropriate message.        
    function onStatusChanged(args) {
        var newStatus = args.status;
        document.getElementById('geolocatorStatus').innerHTML =
            getStatusString(newStatus);
    }

    function getStatusString(locStatus) {
        switch (locStatus) {
            case Windows.Devices.Geolocation.PositionStatus.ready:
                // Location data is available
                return "Location is available.";
                break;
            case Windows.Devices.Geolocation.PositionStatus.initializing:
                // This status indicates that a GPS is still acquiring a fix
                return "A GPS device is still initializing.";
                break;
            case Windows.Devices.Geolocation.PositionStatus.noData:
                // No location data is currently available
                return "Data from location services is currently unavailable.";
                break;
            case Windows.Devices.Geolocation.PositionStatus.disabled:
                // The app doesn't have permission to access location,
                // either because location has been turned off.
                return "Your location is currently turned off. " +
                    "Change your settings through the Settings charm " +
                    " to turn it back on.";
                break;
            case Windows.Devices.Geolocation.PositionStatus.notInitialized:
                // This status indicates that the app has not yet requested
                // location data by calling GetGeolocationAsync() or
                // registering an event handler for the positionChanged event.
                return "Location status is not initialized because " +
                    "the app has not requested location data.";
            case Windows.Devices.Geolocation.PositionStatus.notAvailable:
                // Location is not available on this version of Windows
                return "You do not have the required location services " +
                    "present on your system.";
                break;
            default:
                return "Unknown status.";
        }
    }

    app.start();
})();

ステップ 6: アプリの HTML を追加する

Windows プロジェクトと Windows Phone プロジェクトの default.html ファイルを開き、ファイルの BODY タグ内に次の HTML をコピーします。

    <p>Geolocation Event Sample</p><br />
    <span id="status"></span><br />
    <button id="startTracking">Track Location</button><br />
    <br />
    <button id="stopTracking">Stop Tracking</button><br />
    Latitude: <span id="latitude">Waiting for update...</span><br />
    Longitude:  <span id="longitude">Waiting for update...</span><br />
    Accuracy (in meters): <span id="accuracy">Waiting for update...</span><br />
    Location Status: <span id="geolocatorStatus"></span><br />

ステップ 7: アプリをビルドする

[ビルド][ソリューションのビルド] の順にクリックして、プロジェクトをビルドします。

ステップ 8: アプリをテストする

  1. [デバッグ][デバッグ開始] の順にクリックし、ソリューションをテストします。
  2. サンプルを初めて実行するときは、アプリで位置情報を使ってよいかどうかを確認するメッセージが表示されます。[許可] オプションをクリックします。
  3. [Get Location] (位置情報の取得) をクリックして、現在の位置を取得します。

注釈

位置情報サービスでは、さまざまな情報源を使って位置を特定します。GPS、携帯電話の基地局、Wi-Fi を使うことができない場合は、IP アドレスを代わりに使います。そのような場合は、IP アドレス データが頻繁に更新されないので、位置情報更新イベントを取得できない可能性があります。

アプリケーションで更新を受信登録するのではなく、位置情報のデータを 1 回取得するだけで十分な場合は、GetGeopositionAsync メソッドを使います。このメソッドについては、「クイック スタート: ユーザーの位置の検出」で説明しています。

関連トピック

Windows 10 の地理位置情報のサンプル

Windows 8.1 の地理位置情報のサンプル

Windows.Devices.Geolocation