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

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

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

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

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

setIntervalMillis() メソッドで指定する間隔は、ユースケースによって異なります。リアルタイムのシナリオでは、値を数秒に設定します。それ以外の場合は、数分に制限します(バッテリー使用量を最小限に抑えるには、約 2 分以上にすることをおすすめします)。

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

例: 天気アプリがデバイスの位置情報を必要としている。

getLastLocation() メソッドを使用します。このメソッドは、最後に取得された位置情報を返します(まれに null が返されることがあります)。このメソッドは、位置情報を取得する簡単な方法であり、位置情報の更新を積極的にリクエストすることに関連する費用は発生しません。isLocationAvailable() メソッドと組み合わせて使用します。このメソッドは、getLastLocation() から返された位置情報が十分に最新である場合に true を返します。

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

例: ユーザーが職場、自宅、または別の場所から一定の距離内にいるときに更新をリクエストする。

Fused Location Provider の更新と組み合わせてジオフェンスを使用します。アプリがジオフェンスへの進入トリガーを受信したときに更新をリクエストし、アプリがジオフェンスからの退出トリガーを受信したときに更新を削除します。これにより、ユーザーが定義されたエリアに入った場合にのみ、アプリがより詳細な位置情報の更新を取得できるようになります。

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

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

例: ユーザーが車を運転しているときや自転車に乗っているときにのみ、更新をリクエストする。

Activity Recognition API を、Fused Location Provider の更新と組み合わせて使用します。ターゲット アクティビティが検出されたときに更新をリクエストし、ユーザーがそのアクティビティを停止したときに更新を削除します。

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

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

例: ユーザーが、デバイスが小売店の近くにあるときに通知を受け取ることを希望している。

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

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

  • 滞在の遷移をトラッキングする場合は、setLoiteringDelay() メソッドを使用して、約 5 分以下の値を渡します。

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

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

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

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

可能であれば、PRIORITY_PASSIVE オプションを指定して setPriority() メソッドを使用します。この方法では、バッテリーの消耗がほとんどありません。PRIORITY_PASSIVE を使用できない場合は、PRIORITY_BALANCED_POWER_ACCURACY または PRIORITY_LOW_POWER を使用します。ただし、PRIORITY_HIGH_ACCURACY はバッテリーを大幅に消耗するため、持続的なバックグラウンド処理には使用しないでください。

より多くの位置情報が必要な場合は、setIntervalMillis() に渡す値よりも小さい値を渡して setMinUpdateIntervalMillis() メソッドを呼び出し、パッシブ位置情報を使用します。PRIORITY_PASSIVE オプションと組み合わせると、パッシブ位置情報により、他のアプリによって計算された位置情報を追加費用なしで取得できます。

setMaxUpdateDelayMillis() メソッドを使用して、レイテンシを追加して頻度を調整します。たとえば、setIntervalMillis() メソッドを約 10 分の値で使用する場合は、30 ~ 60 分の値で setMaxUpdateDelayMillis() を呼び出すことを検討してください。これらのオプションを使用すると、アプリの位置情報は約 10 分ごとに計算されますが、アプリは 30 ~ 60 分ごとにしか起動されず、一部の位置情報がバッチ アップデートとして利用可能になります。このアプローチでは、レイテンシを犠牲にして、より多くのデータを利用できるようにし、バッテリー パフォーマンスを向上させます。

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

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

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