このページは役に立ちましたか。
このページのコンテンツについての ご意見をお待ちしております
その他にご意見はありますか。
残り 1500 文字
MSDN ライブラリ
情報
要求されたトピックは次のとおりです。しかし、このトピックはこのライブラリには含まれていません。

Windows Phone 8 で電話の位置を継続的に追跡する方法

2014/06/18

対象: Windows Phone 8 および Windows Phone Silverlight 8.1 のみ

このトピックでは、Windows Phone 位置情報 API を使用して、電話の位置を継続的に追跡する方法を示します。アプリで、特定の位置にいるユーザーをチェックしたり、位置ベースの検索をしたりなど、現在時刻のユーザーの位置だけを必要とする場合は、「Windows Phone 8 で電話の現在位置を取得する方法」で説明するシングルショット手法を使用する必要があります。ユーザーの位置を継続的に追跡すると、1 か所を取得するより多くユーザーのバッテリを消費するため、それが必要なアプリにだけ使用する必要があります。

重要:重要:

Windows Phone アプリで位置情報 API を使用するには、アプリ マニフェスト ファイルの ID_CAP_LOCATION 機能に含める必要があります。そうしないと、開発時にアプリを配置すると、アプリが例外をスローし、Windows Phone ストア に送信した場合に、アプリの取り込みに失敗します。詳細については、「Windows Phone 8 のアプリ機能とハードウェア要件」を参照してください。

ヒントヒント:

Windows ランタイム 位置情報 API は、Windows Phone 8 アプリと Windows Phone 8.1 アプリの両方でサポートされています。このトピックは、Windows Phone 8 ドキュメントの一部です。この機能に関する Windows Phone 8.1 ドキュメント (電話および PC 両方に対応した開発に関する情報を含む) を参照するには、「地理位置情報の検出」を参照してください。

電話の位置を継続的に追跡する

  1. 新しい Windows Phone アプリを作成します。

  2. ソリューション エクスプローラーで、[プロパティ] フォルダーを展開し、WMAppManifest.xml をダブルクリックします。

  3. マニフェスト デザイナーの [機能] タブで、[ID_CAP_LOCATION] の横のチェック ボックスを選択します。

  4. MainPage.xaml 内で、「ContentPanel」という既存のグリッド要素に次の XAML コードを貼り付けます。このコードは、位置情報 API といくつかのテキスト ブロックを起動し、緯度、経度、およびアプリのステータスを表示するボタンを定義します。

    
    <Grid x:Name="ContentPanel" Grid.Row="1" Margin="12,0,12,0">
        <StackPanel>
            <Button x:Name="TrackLocationButton" Click="TrackLocation_Click" Content="track location"/>
            <TextBlock x:Name="LatitudeTextBlock"/>
            <TextBlock x:Name="LongitudeTextBlock"/>
            <TextBlock x:Name="StatusTextBlock"/>
        </StackPanel>
    </Grid>
    
    
    
  5. MainPage.xaml.cs で、ファイルの上部に、次の using ステートメントを追加します。

    
    using System.Threading.Tasks;
    using Windows.Devices.Geolocation;
    
    
    
  6. MainPage クラス定義内で、Geolocator オブジェクトの 1 つの変数と、アプリがアクティブに位置を追跡するかどうかを追跡する 1 つの変数を宣言します。

    
    Geolocator geolocator = null;
    bool tracking = false;
    
    
    
  7. 同意を求めるメッセージを追加して、アプリがユーザーの場所にアクセスするのをユーザーが拒否できるようにします。すべてのアプリは、Location API を使用する前にユーザーの同意を得る必要があります。この例では、アプリが起動するたびに呼び出される MainPage クラスの OnNavigatedTo(NavigationEventArgs) メソッドで、ユーザーの同意を確認します。このコードは最初に ApplicationSettings ディクショナリで "LocationConsent" キーを探します。キーが見つかった場合、ユーザーは既に場所の使用を有効または無効にしています。そのため、メソッドはすぐに制御を返します。キーが見つからない場合は、MessageBox を表示してユーザーに同意を求めます。MessageBox 操作の結果が確認され、ユーザーの同意の状態を示すブール値が ApplicationSettings の "LocationConsent" キーに格納されます。アプリがユーザーの場所にアクセスする前に、このキーが確認されます。

    
    protected override void OnNavigatedTo(System.Windows.Navigation.NavigationEventArgs e)
    {
        if (IsolatedStorageSettings.ApplicationSettings.Contains("LocationConsent"))
        {
            // User has opted in or out of Location
            return;
        }
        else
        {
            MessageBoxResult result = 
                MessageBox.Show("This app accesses your phone's location. Is that ok?", 
                "Location",
                MessageBoxButton.OKCancel);
    
            if (result == MessageBoxResult.OK)
            {
                IsolatedStorageSettings.ApplicationSettings["LocationConsent"] = true;
            }else
            {
                IsolatedStorageSettings.ApplicationSettings["LocationConsent"] = false;
            }
    
            IsolatedStorageSettings.ApplicationSettings.Save();
        }
    }
    
    
    
  8. MainPage.xaml.cs にボタン クリック ハンドラーを貼り付けます。このハンドラーは追跡のオンとオフを切り替えますが、まず ApplicationSettings ディクショナリで "LocationConsent" 値をチェックします。アプリで以前に位置を追跡していない場合は、Geolocator オブジェクトが初期化されます。次に、精度と移動しきい値が設定されます。アプリは、電話機が前の位置から移動しきい値以上に移動した場合にのみ、新しい位置情報によって更新されます。次に、StatusChanged および PositionChanged イベントのイベント ハンドラーが登録されます。最後に、tracking 変数が true に設定され、ボタン テキストが更新されます。

    アプリが以前に位置を追跡していた場合、イベント ハンドラーは追跡をオフにする必要があります。これを実行するには、StatusChanged および PositionChanged イベントのイベント ハンドラーを削除し、Geolocator オブジェクトを null に設定します。最後に、tracking 変数とボタン テキストが更新されます。

    
    private void TrackLocation_Click(object sender, RoutedEventArgs e)
    {
        if ((bool)IsolatedStorageSettings.ApplicationSettings["LocationConsent"] != true)
        {
            // The user has opted out of Location.
            return;
        }
    
        if (!tracking)
        {
            geolocator = new Geolocator();
            geolocator.DesiredAccuracy = PositionAccuracy.High;
            geolocator.MovementThreshold = 100; // The units are meters.
    
            geolocator.StatusChanged += geolocator_StatusChanged;
            geolocator.PositionChanged += geolocator_PositionChanged;
    
            tracking = true;
            TrackLocationButton.Content = "stop tracking";
        }
        else
        {
            geolocator.PositionChanged -= geolocator_PositionChanged;
            geolocator.StatusChanged -= geolocator_StatusChanged;
            geolocator = null;
    
            tracking = false;
            TrackLocationButton.Content = "track location";
            StatusTextBlock.Text = "stopped";
        }
    }
    
    
    
  9. StatusChanged イベントのイベント ハンドラーを MainPage.xaml.cs に貼り付けます。このイベントは、位置情報サービスのステータスが変化するたびに発生します。このメソッドを使用して、ユーザーにフィードバックを提供できます。 このイベント ハンドラーは UI スレッドで呼び出されないため、BeginInvoke(Action) を使用して、UI を変更するコードを実行する必要があります。

    
    void geolocator_StatusChanged(Geolocator sender, StatusChangedEventArgs args)
    {
        string status = "";
    
        switch (args.Status)
        {
            case PositionStatus.Disabled:
                // the application does not have the right capability or the location master switch is off
                status = "location is disabled in phone settings";
                break;
            case PositionStatus.Initializing:
                // the geolocator started the tracking operation
                status = "initializing";
                break;
            case PositionStatus.NoData:
                // the location service was not able to acquire the location
                status = "no data";
                break;
            case PositionStatus.Ready:
                // the location service is generating geopositions as specified by the tracking parameters
                status = "ready";
                break;
            case PositionStatus.NotAvailable:
                status = "not available";
                // not used in WindowsPhone, Windows desktop uses this value to signal that there is no hardware capable to acquire location information
                break;
            case PositionStatus.NotInitialized:
                // the initial state of the geolocator, once the tracking operation is stopped by the user the geolocator moves back to this state
    
                break;
        }
    
        Dispatcher.BeginInvoke(() =>
        {
            StatusTextBlock.Text = status;
        });
    }
    
    
    
  10. PositionChanged イベントのイベント ハンドラーを MainPage.xaml.cs に貼り付けます。このイベントは、電話機が、前の位置からその移動しきい値より大きい距離を移動するたびに発生します。繰り返しますが、このイベント ハンドラーは UI スレッドで呼び出されないため、BeginInvoke(Action) を使用して、UI を変更するコードを実行する必要があります。

    
    void geolocator_PositionChanged(Geolocator sender, PositionChangedEventArgs args)
    {
        Dispatcher.BeginInvoke(() =>
        {
            LatitudeTextBlock.Text = args.Position.Coordinate.Latitude.ToString("0.00");
            LongitudeTextBlock.Text = args.Position.Coordinate.Longitude.ToString("0.00");
        });
    }
    
    
    

表示:
© 2015 Microsoft