実際のシナリオに合わせて位置情報の使用を最適化する

このセクションでは、一般的な位置情報収集のシナリオについて説明し、Geofencing API と Fused Location Provider API の最適な使用方法に関する推奨事項を紹介します。

ユーザーから見える(フォアグラウンドの)更新

例: 非常に低いレイテンシと高頻度の正確な更新を必要とする地図アプリ。すべての更新はフォアグラウンドで行われます。ユーザーはアクティビティを開始し、位置情報データを使用して、その後間もなくアクティビティを停止します。

PRIORITY_HIGH_ACCURACY または PRIORITY_BALANCED_POWER_ACCURACY の値を指定して、setPriority() メソッドを使用します。

setInterval() メソッドに指定する間隔は、ユースケースに応じて異なります。リアルタイムの更新が必要な状況では、値を数秒に設定します。それ以外の場合は、数分に制限します(電池使用量を最小限に抑えるため、おおよそ 2 分以上が推奨されます)。

デバイスの位置を確認する

例: デバイスの位置情報の確認を求める天気予報アプリ。

getLastLocation() メソッドを使用します。このメソッドは、最新の利用可能な位置情報(まれに Null の場合があります)を返します。このメソッドを使用すると、位置情報を簡単に取得できます。また、位置情報の更新データをアクティブにリクエストすることに伴うコストが発生しません。getLastLocation() から返される位置情報が十分新しい場合に true を返す isLocationAvailable() メソッドと組み合わせて使用してください。

ユーザーが特定の場所にいるときに更新を開始する

例: ユーザーが職場、自宅、その他の場所から特定の距離内にいるときに更新データをリクエストする。

ジオフェンスを、融合された位置予測プロバイダの更新データと組み合わせて使用します。アプリがジオフェンスへの entrance トリガーを受信したら更新データをリクエストし、ジオフェンスからの exit トリガーを受信したら更新データを削除します。これにより、定義されたエリア内にユーザーが入ったときにのみ、アプリはより精度の高い位置情報の更新データを取得します。

このシナリオの一般的なワークフローでは、ユーザーがジオフェンス内に入ったときに通知を表示し、ユーザーが通知をタップしたときに更新データをリクエストするコードを含むアクティビティを起動します。

ユーザーのアクティビティの状態に基づいて更新を開始する

例: ユーザーがバイクを運転しているとき、またはバイクにまたがっているときにのみ更新データをリクエストする。

Activity Recognition API を、融合された位置予測プロバイダの更新データと組み合わせて使用します。対象となるアクティビティが検出された時点で更新データをリクエストし、ユーザーがそのアクティビティの実行を停止した時点で更新データを削除します。

このユースケースの一般的なワークフローでは、検出されたアクティビティの通知を表示し、ユーザーが通知をタップしたときに更新データをリクエストするコードを含むアクティビティを起動します。

地理的エリアに関連付けられたバックグラウンド位置情報の更新を長期的に実行する

例: デバイスが特定の店舗に近づいたときに通知を受けることをユーザーが求めている。

これはジオフェンスに最適なユースケースです。このユースケースでは、ほぼ確実にバックグラウンド位置情報が必要になるため、addGeofences(GeofencingRequest, PendingIntent) メソッドを使用します。

以下の構成オプションを設定する必要があります。

  • 滞留状態の遷移をトラッキングする場合は、setLoiteringDelay() メソッドを使用し、おおよそ 5 分以下の値を渡します。

  • setNotificationResponsiveness() を使用し、おおよそ 5 分の値を渡します。ただし、アプリが応答性で追加の遅延を管理できる場合は、おおよそ 10 分の値を使用することを検討してください。

アプリが一度に登録できるジオフェンスの数は最大 100 個に制限されています。アプリが多数の店舗オプションをトラッキングすることを要求するユースケースでは、大きいジオフェンス(都市レベル)を登録し、大きいジオフェンス内の店舗に対して小さいジオフェンス(都市内の区域)を動的に登録することもできます。ユーザーが大きいジオフェンス内に入ったら、小さいジオフェンスを追加します。ユーザーが大きいジオフェンスから出たら、小さいジオフェンスを削除して、新しいエリアのジオフェンスを再登録します。

アプリ コンポーネントが見えない状態でバックグラウンド位置情報の更新を長期的に実行する

例: 位置情報をパッシブにトラッキングするアプリ。

可能であれば、ほとんど電池を消耗しない PRIORITY_NO_POWER オプションを指定して setPriority() メソッドを使用します。PRIORITY_NO_POWER を使用できない場合は、PRIORITY_BALANCED_POWER_ACCURACY または PRIORITY_LOW_POWER を使用します。ただし、継続的なバックグラウンド処理には PRIORITY_HIGH_ACCURACY を使用しないでください。このオプションを使用すると電池が著しく消耗します。

より多くの位置情報データが必要な場合は、パッシブな位置情報を利用します。そのためには、setFastestInterval() メソッドを呼び出し、setInterval() に渡す値よりも小さい値を渡します。PRIORITY_NO_POWER オプションと組み合わせると、パッシブな位置情報を利用して、他のアプリが計算した位置情報を追加のコストなしで配信できます。

setMaxWaitTime() メソッドにより、レイテンシを追加して頻度を適切に調整します。たとえば、おおよそ 10 分の値を指定して setinterval() メソッドを使用する場合は、30 分~ 60 分の値を指定して setMaxWaitTime() を呼び出すことを検討してください。これらのオプションを使用すると、アプリ用の位置情報が約 10 分間隔で計算されますが、アプリは 30 分~ 60 分の間隔でウェイクアップし、バッチ更新データとして取得できる位置情報を使用します。このアプローチでは、レイテンシの増加と引き換えに、処理できるデータ量が増え、電池のパフォーマンスが向上します。

ユーザーが他のアプリを操作している間に高精度の更新を頻繁に行う

例: ユーザーが画面をオフにするか別のアプリを開いても引き続き動作するナビゲーション アプリやフィットネス アプリ。

フォアグラウンド サービスを使用します。アプリがユーザーに代わって負荷の高い処理を行う可能性がある場合は、その処理をユーザーに意識させることをおすすめします。フォアグラウンド サービスは、継続的な通知を必要とします。詳細については、通知の概要をご覧ください。