Wear OS 上で位置情報を検出する

スマートウォッチは容易に視認可能な小型のフォーム ファクタです。そのため、Wear OS は、ユーザーの位置情報の記録や報告を行い、それに反応するアプリにとって理想的なプラットフォームです。たとえば、ユーザーの距離、速度、方向をリアルタイムで伝えるアプリや、ユーザーの周辺の情報が一目でわかるキューを提供するアプリを作成できます。

詳細については、位置を認識できるアプリを作成するをご覧ください。

スマートウォッチの中には、GPS センサーを搭載しており、接続状態のスマートフォンがなくても位置情報データを取得できるものがあります。スマートウォッチ アプリで位置情報データをリクエストすると、システムは、最も電源効率がよい方法でスマートフォンまたはスマートウォッチからデータを取得します。そのため、スマートウォッチに GPS センサーが搭載されていない場合でも、位置情報データを取得できます。

位置情報データの取得によるバッテリー駆動時間への影響を抑えるには、値 PRIORITY_BALANCED_POWER_ACCURACYsetPriority() を呼び出します。優先度の設定が異なると、チップの最適化の方法が異なる可能性があります。

可能であれば、電池を節約するために、setInterval() を使用した位置情報データのリクエストを 1 分あたり 1 回以下にしてください。

以降のセクションで説明するように、センサーが搭載されていないスマートウォッチがスマートフォンから接続解除された場合、アプリは位置情報データの喪失に対処する必要があります。

方法を選択する

Wear OS アプリに位置情報データを提供する方法はいくつかあり、Fused Location Provider(FLP)または Wear ヘルスサービス(WHS)を使用できます。FLP は Google Play 開発者サービス API です。

FLP は次の状況で使用します。

  • 駐車中の車両の場所にマークを付けるなど、現時点では位置情報データが必要であるものの、継続的に取得する必要はない場合。
  • 継続的に位置情報を必要とするものの、位置情報履歴は必要ない場合。

WHS は次のケースで使用します。

  • 他のセンサーのデータが必要な場合、または今後他のセンサーのデータが必要になる可能性が高い場合。
  • アプリが、特定の時間間隔にわたって位置情報データを追跡する必要があるワークアウト アプリまたはエクササイズ アプリである場合。

iPhone とペア設定されたスマートウォッチについては、iPhone とペア設定されているスマートウォッチの位置情報をご覧ください。

Fused Location Provider を使用する

スマートウォッチでは、FusedLocationProviderClient を使用して位置情報データを取得します。FLP はスマートフォンの位置情報データを使用することがあります。詳細については、位置情報サービス クライアントを作成するをご覧ください。

位置情報の更新のリクエストと、ユーザーの位置情報の継続的なトラッキングについては、現在地の更新情報をリクエストするをご覧ください。

オンボード GPS を検出する

ユーザーが GPS センサーを搭載していないスマートウォッチを身に着け、ペア設定したスマートフォンを持たずにジョギングに出かけた場合、スマートウォッチ アプリは、接続済みのデバイスから位置情報データを取得できません。アプリでこの状況を検出し、位置情報機能が利用できないことをユーザーに警告してください。

スマートウォッチが GPS センサーを搭載しているかを確認するには、PackageManager.FEATURE_LOCATION_GPS を使用して hasSystemFeature() メソッドを呼び出します。次のコードは、アクティビティの開始時に、スマートウォッチに GPS センサーが搭載されているかどうかを検出します。

Kotlin

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    setContentView(R.layout.main_activity)

    if (!hasGps()) {
        Log.d(TAG, "This hardware doesn't have GPS.")
        // Fall back to functionality that doesn't use location or
        // warn the user that location function isn't available.
    }
}

private fun hasGps(): Boolean =
        packageManager.hasSystemFeature(PackageManager.FEATURE_LOCATION_GPS)

Java

protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_activity);

    if (!hasGps()) {
        Log.d(TAG, "This hardware doesn't have GPS.");
        // Fall back to functionality that doesn't use location or
        // warn the user that location function isn't available.
    }
    ...
}

private boolean hasGps() {
    return getPackageManager().hasSystemFeature(PackageManager.FEATURE_LOCATION_GPS);
}

切断イベントを処理する

GPS センサーが搭載されておらず、スマートフォンとの接続が解除されたスマートウォッチは、位置情報データ ストリームを失います。継続的なデータ ストリームを必要とするアプリは、接続の喪失を検出してユーザーに警告し、機能面でのグレースフル デグラデーションを行う必要があります。

モバイル デバイスと同様に、FusedLocationProviderClient.requestLocationUpdates() を使用して位置情報の更新をリクエストする場合は、LocationCallback または PendingIntent を渡します。どちらも位置情報と LocationAvailability ステータスを含みます。

LocationCallback オプションを使用する場合は、onLocationAvailability() をオーバーライドして、位置情報の可用性のステータスに関する最新情報を受け取るようにしてください。

PendingIntent オプションを使用し Intent が返された場合は、LocationAvailability.extractLocationAvailability(Intent) メソッドを使用して Intent から位置情報の可用性に関するステータスを抽出します。

位置情報を検出できなくなった場合

GPS 信号が失われた場合は、ユーザーのスマートウォッチについて最後に認識された位置情報を取得できます。最後に認識された位置情報を取得することは、GPS を修正できない場合と、GPS を搭載していないスマートウォッチがスマートフォンとの接続を喪失した場合に有効です。詳細については、直近の位置情報を取得するをご覧ください。

一括呼び出しで位置情報をフラッシュする

一括呼び出しを使用している場合は、画面がオンに戻ったとき、またはアンビエント モードから戻ったときに flushLocations() を呼び出して、一括処理された位置情報をすぐに、登録されている LocationListenersLocationCallbacksPending Intents すべてに返します。