スタンドアロン デバイスでネットワーク経由で直接通信する

Wear OS by Google 搭載のスマートウォッチは、Android または iOS スマートフォンにアクセスしなくても、ネットワークと直接通信できます。Wear OS アプリをネットワークに接続するために Data Layer API を使用しないでください。代わりに、このガイドのガイドラインと手順を実施してください。

ネットワーク アクセス

Wear OS アプリはネットワーク リクエストを行うことができます。スマートウォッチが Bluetooth でスマートフォンに接続している場合、スマートウォッチのネットワーク トラフィックは、通常、スマートフォンを介してプロキシされます。

スマートフォンが利用できない場合は、スマートウォッチのハードウェアに応じて、Wi-Fi とモバイル ネットワークが使用されます。ネットワーク間の遷移は Wear OS プラットフォームによって処理されます。

HTTP、TCP、UDP などのプロトコルは使用できますが、ただし、CookieManager クラスを含む android.webkit API は使用できません。Cookie を使用するには、リクエストとレスポンスのヘッダーの読み書きを行います。

定期的なポーリングなどの非同期リクエストには、WorkManager を使用します。

特定のネットワーク タイプに接続する必要がある場合は、ネットワークの状態の読み取りをご覧ください。

高帯域幅ネットワークへのアクセス

Wear OS プラットフォームは、全体的なユーザー エクスペリエンスを最大限に高めることを目的にネットワーク接続を管理します。プラットフォームは、長いバッテリー駆動時間とネットワーク帯域幅という 2 つのニーズのバランスを取り、デフォルトのアクティブ ネットワークを選択します。

バッテリーの確保を優先する場合、アクティブなネットワークでは、大きなファイルの転送やストリーミング メディアなどのネットワーク タスクに対して十分な帯域幅が確保できない場合があります。

このセクションでは、ConnectivityManager クラスを使用して、アプリが必要とするネットワーク帯域幅を確保する方法について説明します。ネットワーク リソースのきめ細かい制御に関する一般的な情報については、ネットワーク使用量の管理をご覧ください。

Wi-Fi 接続をリクエストする

大容量のファイルの転送やメディアのストリーミングなど、高帯域幅のネットワーク アクセスが必要なユースケースでは、Wi-Fi などの高帯域幅のトランスポートによる接続をリクエストします。これを次の例に示します。

Kotlin

val callback = object : ConnectivityManager.NetworkCallback() {
    override fun onAvailable(network: Network) {
        super.onAvailable(network)
        // The Wi-Fi network has been acquired. Bind it to use this network by default.
        connectivityManager.bindProcessToNetwork(network)
    }

    override fun onLost(network: Network) {
        super.onLost(network)
        // Called when a network disconnects or otherwise no longer satisfies this request or callback.
    }
}
connectivityManager.requestNetwork(
    NetworkRequest.Builder().addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build(),
    callback
)

Java

ConnectivityManager.NetworkCallback callback = new ConnectivityManager.NetworkCallback() {
    public void onAvailable(Network network) {
        super.onAvailable(network);
        // The Wi-Fi network has been acquired. Bind it to use this network by default.
        connectivityManager.bindProcessToNetwork(network);
    }

    public void onLost(Network network) {
        super.onLost(network);
        // Called when a network disconnects or otherwise no longer satisfies this request or callback.
    }
};
connectivityManager.requestNetwork(
        new NetworkRequest.Builder().addTransportType(NetworkCapabilities.TRANSPORT_WIFI).build(),
        callback
);

バッテリーを節約するためにスマートウォッチの Wi-Fi またはセルラー通信がオフになることがあるため、ネットワークをすぐに取得できない場合があります。スマートウォッチがネットワークに接続できない場合、NetworkCallback インスタンスの onAvailable() メソッドは呼び出されません。

onAvailable() が呼び出されると、デバイスは NetworkCallback が解放されるまで Wi-Fi ネットワークへの接続を維持しようとします。バッテリーを長持ちさせるには、Wi-Fi ネットワークが不要になったときに、次の例に示すようにコールバックを解除します。

Kotlin

connectivityManager.bindProcessToNetwork(null)
connectivityManager.unregisterNetworkCallback(callback)

Java

connectivityManager.bindProcessToNetwork(null);
connectivityManager.unregisterNetworkCallback(callback);

Wi-Fi 設定アクティビティを開始する

保存済みネットワークが構成されていて範囲内にある場合、Wi-Fi ネットワークをリクエストすると、システムは保存済みネットワークへの接続を試みます。利用可能な保存済み Wi-Fi ネットワークがない場合、NetworkCallback インスタンスの onAvailable コールバック メソッドは呼び出されません。

Handler を使用してネットワーク リクエストをタイムアウトにしている場合は、タイムアウトが発生したときに Wi-Fi ネットワークを追加するようユーザーに指示できます。次のインテントを使用して、Wi-Fi ネットワークを追加するアクティビティにユーザーを直接誘導します。

Kotlin

context.startActivity(Intent("com.google.android.clockwork.settings.connectivity.wifi.ADD_NETWORK_SETTINGS"))

Java

context.startActivity(new Intent("com.google.android.clockwork.settings.connectivity.wifi.ADD_NETWORK_SETTINGS"));

設定アクティビティを開始するには、アプリに CHANGE_WIFI_STATE 権限が必要です。

ユーザー インターフェースに関する考慮事項

アプリが高帯域幅オペレーションのために新しい Wi-Fi ネットワークへの接続を必要とする場合は、Wi-Fi 設定を開始する前に、接続理由をユーザーに明確に示す必要があります。高帯域幅ネットワークが必要な場合にのみ、新しい Wi-Fi ネットワークの追加をユーザーにリクエストします。高帯域幅ネットワークを必要としないアプリ機能にユーザーがアクセスすることをブロックしないでください。

図 1 は音楽アプリを示しています。このアプリを使用すると、ユーザーは低帯域幅のネットワークで音楽を閲覧でき、音楽のダウンロードまたはストリーミングを行う場合にのみ、新しい Wi-Fi ネットワークの追加が必要になります。

音楽のダウンロード

図 1. 音楽アプリのダウンロード フロー

電力とデータの使用に関する考慮事項

バッテリーを長持ちさせ、モバイルデータの使用量を最小限に抑えるには、Wear OS デバイスが LTE 接続や従量制接続の代わりに Bluetooth 接続や Wi-Fi 接続を再確立するまで、分析レポートやログ収集などの必須でないネットワーク タスクを延期します。

クラウド メッセージング

通知の送信には、Firebase Cloud Messaging(FCM)を直接使用します。

ネットワーク アクセスや FCM 用の API は、Wear OS に固有のものではありません。ネットワークへの接続クラウド メッセージングについては、既存のドキュメントをご覧ください。

FCM は Doze モードでも正常に動作するため、スマートウォッチに通知を送信する場合におすすめの方法です。

Wear OS アプリの実行時にデバイスの登録トークンを収集して、FCM からのメッセージを提供します。次に、サーバーから FCM REST エンドポイントにメッセージを送信するときに、宛先の一部としてこのトークンを含めます。FCM は、トークンで識別されるデバイスにメッセージを送信します。

FCM メッセージは JavaScript Object Notation(JSON)形式であり、次のペイロードのいずれかまたは両方を含めることができます。

  • 通知ペイロード: スマートウォッチが通知ペイロードを受信すると、通知ストリーム内でデータが直接ユーザーに表示されます。ユーザーが通知をタップすると、アプリが起動します。
  • データ ペイロード: ペイロードに一連のカスタム Key-Value ペアが含まれている場合。ペイロードは Wear OS アプリにデータとして配信されます。

ペイロードの詳細と例については、FCM メッセージについてをご覧ください。

デフォルトでは、通知はスマートフォン アプリからスマートウォッチにブリッジされます。スタンドアロンの Wear OS アプリとそれに対応するスマートフォン アプリがある場合、通知が重複することがあります。たとえば、スマートフォンとスマートウォッチの両方で FCM から受信した 1 つの通知を、両方のデバイスで別々に表示できます。これを防ぐには、ブリッジ API を使用します。

バックグラウンド サービスを使用する

バックグラウンド タスクが正しく実行されるようにするには、タスクで Doze とアプリ スタンバイを考慮する必要があります。

画面がオフになるか常に画面表示モードになると、Doze のサブセットが発生し、バックグラウンド タスクが一定期間遅延することがあります。その後、デバイスが長時間停止すると、通常の Doze が発生します。WorkManager API を使用してリクエストをスケジュールします。これにより、アプリが Doze 対応のコード実行に登録できるようになります。

制約を含むスケジュールを設定する

制約を使用すると、バッテリーを長持ちさせるようにリクエストを構成できます。リクエストに含める制約を 1 つ以上選択します。

  • ネットワークを必要とするリクエストをスケジュールします。

    NetworkTypeCONNECTEDUNMETERED かを指定します。UNMETERED は大規模なデータ転送に、CONNECTED は小規模な転送に使用します。

  • 充電中のリクエストのスケジュールを設定できます。

  • デバイスがアイドル状態のときにリクエストをスケジュール設定します。これは、特にデバイスが充電中の場合に、優先度の低いバックグラウンド処理や同期に役立ちます。

詳細については、WorkManager の定期的な処理に対する制約の影響に関するガイドをご覧ください。