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

スマートウォッチは一目で見ることができる小型のフォーム ファクタです。そのため、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 センサーを内蔵していないスマートウォッチは、テザリングによるスマートフォンとのデータ接続が失われると、位置情報データ ストリームを突然喪失します。継続的なデータ ストリームを必要とするアプリは、接続の喪失を検出してユーザーに警告し、機能面でのグレースフル デグラデーションを行う必要があります。

テザリング データ接続の喪失を検出するには、NodeApiGetConnectedNodesResult メソッドを使用します。次に例を示します。

  1. 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);
    }
    
  2. 次のコールバック メソッドを使用して、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 を内蔵していないスマートウォッチがスマートフォンとの接続を喪失した場合に役立ちます。詳細については、直近の位置情報を取得するをご覧ください。