スマートウォッチは容易に視認可能な小型のフォーム ファクタです。そのため、Wear OS は、ユーザーの位置情報の記録や報告を行い、それに反応するアプリにとって理想的なプラットフォームです。たとえば、ユーザーの距離、速度、方向をリアルタイムで伝えるアプリや、ユーザーの周辺の情報が一目でわかるキューを提供するアプリを作成できます。
詳細については、位置を認識できるアプリを作成するをご覧ください。
スマートウォッチの中には、GPS センサーを搭載しており、接続状態のスマートフォンがなくても位置情報データを取得できるものがあります。スマートウォッチ アプリで位置情報データをリクエストすると、システムは、最も電源効率がよい方法でスマートフォンまたはスマートウォッチからデータを取得します。そのため、スマートウォッチに GPS センサーが搭載されていない場合でも、位置情報データを取得できます。
位置情報データの取得によるバッテリー駆動時間への影響を抑えるには、値 PRIORITY_BALANCED_POWER_ACCURACY
で setPriority()
を呼び出します。優先度の設定が異なると、チップの最適化の方法が異なる可能性があります。
可能であれば、電池を節約するために、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()
を呼び出して、一括処理された位置情報をすぐに、登録されている LocationListeners
、LocationCallbacks
、Pending Intents
すべてに返します。
あなたへのおすすめ
- 注: JavaScript がオフになっている場合はリンクテキストが表示されます
- 位置情報を最適化してバッテリーの消耗を抑える
- 通知を作成する {:#notification}
- ユーザーがアクティビティを開始したときや終了したときに検出する