制約のある衛星ネットワーク向けに開発する

衛星ネットワークは、いつか通常のネットワークとして機能し、すべてのアプリのユースケースでシームレスに動作するほど堅牢になるでしょう。しかし、現時点では、これらのネットワーク上のデータは希少なリソースです。データ使用に制約がある衛星ベースのネットワークは、制約付き衛星ネットワークと呼ばれます。

このような制約があるため、Android アプリはデフォルトでこれらのネットワークを使用しません。制約のある衛星ネットワークでアプリを動作させる場合は、衛星データ使用向けに最適化されたアプリとして識別し、制約のある衛星ネットワークに接続されたときにリソースを節約するようにアプリのユースケースを適応させる必要があります。

アプリのユースケースを適応させる

アプリが制約付き衛星ネットワークにアクセスできるようにするには、オプトインするだけです。ただし、限られたネットワーク リソースを責任を持って使用するために、アプリの動作を最適化する変更が必要になる場合があります。データ使用量を制限するために最適化する際は、次の点を考慮してください。

  • アプリが制約のあるネットワークでの使用に適しているかどうかを判断します。一部のアプリは、どのような状況でもデータ制限のあるネットワークに適していません。たとえば、動画ストリーミング アプリは衛星ネットワークをまったく使用しないことを選択できますが、衛星ネットワークの存在を特定し、既存の制限付きネットワークでは機能しないことをユーザーに通知することはできます。
  • 制限または変更する特定のユースケースを特定します。アプリの機能によっては、データ制限モードに適しているものもあれば、そうでないものもあります。たとえば、テキスト メッセージの送信は問題なく行えますが、HD 動画のアップロードを試みると、ユーザー エクスペリエンスが低下する可能性があります。これは、ローミング時に多くのアプリが動作を変更するのと同様です。
  • アプリのネットワーク リソースの使用方法を調整します。制約付きネットワークは、アプリがネットワーク オペレーションをバーストで実行し、ほとんどの時間をネットワークを使用せずに費やす場合に最適です。頻繁なネットワーク トラフィックやチャットのようなネットワーク トラフィックの作成は避けてください。たとえば、プッシュ トゥ トークの音声は、リアルタイムの音声通話よりもネットワークの制約が厳しい状況に適しています。

アプリで複雑なネットワーク ロジックFirebase Cloud Messaging を使用している場合は、特定の変更も必要になります。

制約のあるネットワーク向けに最適化されていることを自己識別する

制約付きネットワーク用に最適化されたアプリとして識別し、それらを使用するようにオプトインするには、次のように <meta-data> 要素を使用してアプリ マニフェスト ファイルを更新します。

<meta-data android:name="android.telephony.PROPERTY_SATELLITE_DATA_OPTIMIZED"
          android:value="PACKAGE_NAME" />

この要素を使用すると、利用可能なネットワークが制約付きの衛星ネットワークのみの場合に、アプリがそのネットワークを使用できるようになります。また、アプリが制約のあるネットワーク向けに最適化されていることをシステムに通知し、設定アプリの衛星通信対応アプリのリストに表示することで、ユーザーによるアプリの発見を支援します。

データが制約されている状況での動作を変更する

制約付きネットワークを使用する際にアプリの動作を変更する必要がある場合や、アプリに ConnectivityManager を使用してネットワークの使用を管理する既存のロジックがある場合は、ネットワーク フローにいくつかの変更を加える必要があります。

制約付きデータ条件を検出する

ネットワーク リクエストに使用される NetworkCapabilities オブジェクトには、すべてのネットワークでデフォルトで設定され、帯域幅が制限されているネットワークで削除される NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED ビットが含まれます。ネットワークが帯域幅制限されているかどうかは、NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED 機能があるかどうかを確認することで判断できます。

制約のあるネットワークを使用する

NetworkRequest オブジェクトには、デフォルトで NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED 機能も含まれています。この機能を削除して、制約付きネットワークが許容されることを示します。

制約のあるネットワークに接続したことを検出したら、必要に応じてアプリの機能を調整できます。

Kotlin

val HandlerThread = HandlerThread("SatelliteNetworkMonitor"
handlerThread.start()
val handler = Handler(handlerThread.getLooper())

// Make the network request.
val request = NetworkRequest.Builder()
    .addCapability(NET_CAPABILITY_INTERNET
    .removeCapability(NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED)
    .build()

// Register for the callback.
val callback = NetworkCallback() {
    override fun onCapabilitiesChanged(net: Network, nc: NetWorkCapabilities) {
        updateAppUseCases(net, nc)
    }

    fun updateAppUseCases(net: Network, nc: NetworkCapabilities) {
        if (!nc.hasCapability(NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED) ||
             nc.hasTransport(NetworkCapabilities.TRANSPORT_SATELLITE)) {
            // Adapt to constrained network or disable heavy data usage features.
            ...
        } else {
            // Revert to unconstrained behavior.
            ...
        }
    }
}
// Where cm is your ConnectivityManager object:
cm.registerBestMatchingNetworkCallback(request, callback, handler)

Java

HandlerThread handlerThread = new HandlerThread("SatelliteNetworkMonitor");
handlerThread.start();
Handler handler = new Handler(handlerThread.getLooper());

// Make the network request.
NetworkRequest request = new NetworkRequest.Builder()
    .addCapability(NET_CAPABILITY_INTERNET)
    .removeCapability(NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED)
    .build();

// Register for the callback.
NetworkCallback callback = new NetworkCallback() {
    @Override
    public void onCapabilitiesChanged(Network net, NetworkCapabilities nc) {
        updateAppUsecases(net, nc);
    }
    private void updateAppUsecases(Network net, NetworkCapabilities nc) {
        if (!nc.hasCapability(NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED) || nc.hasTransport(NetworkCapabilities.TRANSPORT_SATELLITE)) {
            // Adapt to constrained network or disable heavy data usage features.
            ...
        } else {
            // Revert to unconstrained behavior.
            ...
        }
    }
};
// Where cm is your ConnectivityManager object:
cm.registerBestMatchingNetworkCallback(request, callback, handler);

制約のあるネットワークで FCM メッセージを受信する

アプリが Firebase Cloud Messaging(FCM)を使用してアプリサーバーからメッセージを受信する場合、FCM サーバーにメッセージを渡すときに bandwidth_constrained_ok フラグを含めることで、制約のあるネットワークでも特定のメッセージを配信する必要があることを示すことができます。

{
  "message":{
    "token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
    "notification":{
      "title":"Portugal vs. Denmark",
      "body":"great match!"
    }
    "android": {
       "bandwidth_constrained_ok": true
    }
  }
}

メッセージにこのフラグが含まれていない場合、FCM サーバーは制約のないネットワーク経由でデバイスが接続されている場合にのみメッセージを配信します。