衛星ネットワークは、いつか通常のネットワークとして機能し、すべてのアプリのユースケースでシームレスに動作するほど堅牢になるでしょう。しかし、現時点では、これらのネットワーク上のデータは希少なリソースです。データ使用に制約がある衛星ベースのネットワークは、制約付き衛星ネットワークと呼ばれます。
このような制約があるため、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 サーバーは制約のないネットワーク経由でデバイスが接続されている場合にのみメッセージを配信します。