スマートウォッチは一目で見ることができる小型のフォーム ファクタです。そのため、Wear OS by Google は、ユーザーの位置情報の記録や報告を行ったり、それに反応したりするアプリにとって理想的なプラットフォームになっています。たとえば、ユーザーの距離、速度、方向をリアルタイムで伝えるアプリや、ユーザーの周辺の情報が一目でわかるキューを提供するアプリを作成できます。
以下の関連リソースをご覧ください。
スマートウォッチの中には、GPS センサーを内蔵していて、テザリング用のスマートフォンがなくても位置情報データを取得できるものがあります。ただし、スマートウォッチ アプリで位置情報データをリクエストするときは、位置情報データの発信元を気にする必要はありません。システムは、最も電源効率がよい方法でデータを取得します。しかし、下記で説明するように、アプリは位置情報データの喪失を処理する必要があります。
スマートウォッチ上で位置情報データを取得する際は、融合された位置予測プロバイダを使用することをおすすめします。また、このドキュメントでは、スマートウォッチに搭載された位置情報センサーの確認方法、位置情報データの受信方法、テザリングによるデータ接続のモニタリング方法について説明します。iPhone とペア設定されているスマートウォッチの位置情報もご覧ください。
位置情報データの取得による電池寿命への悪影響を抑えるには、アプリで setPriority()
を呼び出して PRIORITY_BALANCED_POWER_ACCURACY
に設定します。setInterval()
を使用して、1 分に 1 回以下の頻度で位置情報をリクエストするようにします。
注: このドキュメントは、Google Play 開発者サービス API を使用して位置情報データを取得する方法を理解していることを前提としています。
融合された位置予測プロバイダを使用する
スマートウォッチでは、FusedLocationProviderApi
(FLP)を使用して位置情報データを取得する必要があります。スマートウォッチに GPS センサーがない場合、FLP は自動的にスマートフォンの位置情報データを使用します。
詳細については、位置情報サービス クライアントを作成するをご覧ください。
現在地の更新情報をリクエストする方法と、ユーザーの位置情報を継続的にトラッキングする方法については、現在地の更新情報を受け取るをご覧ください。
オンボード GPS を検出する
ユーザーが GPS センサーを内蔵していないスマートウォッチを身に着け、ペア設定したスマートフォンを忘れてジョギングに出かけた場合、スマートウォッチ アプリは、テザリング接続を通じて位置情報データを取得することができません。アプリはこの状況を検出し、位置情報機能を利用できないことをユーザーに警告する必要があります。
スマートウォッチが 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 does not use location or // warn the user that location function is not 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 does not use location or // warn the user that location function is not available. } ... } private boolean hasGps() { return getPackageManager().hasSystemFeature(PackageManager.FEATURE_LOCATION_GPS); }
切断イベントを処理する
GPS センサーを内蔵していないスマートウォッチは、テザリングによるスマートフォンとのデータ接続が失われると、位置情報データ ストリームを突然喪失します。継続的なデータ ストリームを必要とするアプリは、接続の喪失を検出してユーザーに警告し、機能面でのグレースフル デグラデーションを行う必要があります。
テザリング データ接続の喪失を検出するには、NodeApi
の GetConnectedNodesResult
メソッドを使用します。次に例を示します。
GoogleApiClient
を初期化し、NodeApi
を呼び出すメソッド(例:inspectNodes
という名前のメソッド)を作成します。Kotlin
private lateinit var googleApiClient: GoogleApiClient private var wearableConnected = false override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) googleApiClient = GoogleApiClient.Builder(this) .addApi(Wearable.API) .addConnectionCallbacks(object : GoogleApiClient.ConnectionCallbacks { override fun onConnected(connectionHint: Bundle?) { inspectNodes() } override fun onConnectionSuspended(cause: Int) {} }) .build() } private fun inspectNodes() { Wearable.NodeApi .getConnectedNodes(googleApiClient) .setResultCallback(this, 1000, TimeUnit.MILLISECONDS) }
Java
private GoogleApiClient googleApiClient; private boolean wearableConnected = false; @Override public void onCreate() { super.onCreate(); googleApiClient = new GoogleApiClient.Builder(this) .addApi(Wearable.API) .addConnectionCallbacks(new GoogleApiClient.ConnectionCallbacks() { @Override public void onConnected(Bundle connectionHint) { inspectNodes(); } @Override public void onConnectionSuspended(int cause) { } }) .build(); } private void inspectNodes(){ Wearable.NodeApi.getConnectedNodes(googleApiClient).setResultCallback(this, 1000, TimeUnit.MILLISECONDS); }
- 次のコールバック メソッドを使用して、
inspectNodes
メソッドの結果を取得します。Kotlin
override fun onResult(getConnectedNodesResult: NodeApi.GetConnectedNodesResult) { wearableConnected = false getConnectedNodesResult.nodes.forEach { node -> wearableConnected = wearableConnected or node.isNearby } Log.v("TEST", "wearableConnected: $wearableConnected") }
Java
@Override public void onResult(NodeApi.GetConnectedNodesResult getConnectedNodesResult) { if (getConnectedNodesResult != null && getConnectedNodesResult.getNodes() != null){ wearableConnected = false; for (Node node : getConnectedNodesResult.getNodes()){ if (node.isNearby()){ wearableConnected = true; } } } Log.v("TEST", "wearableConnected: " + wearableConnected); }
位置情報を検出できなくなった場合
GPS 信号が失われた場合、ユーザーのスマートウォッチの直近の位置情報を取得できます。直近の位置情報を取得すると、GPS を修正できない場合や、GPS を内蔵していないスマートウォッチがスマートフォンとの接続を喪失した場合に役立ちます。詳細については、直近の位置情報を取得するをご覧ください。