Um dia, as redes de satélite serão robustas o suficiente para funcionar como redes normais e trabalhar perfeitamente com todos os casos de uso de apps. Mas, por enquanto, os dados nessas redes são um recurso escasso. Uma rede baseada em satélite com restrições no uso de dados é chamada de rede de satélite restrita.
Devido a essas restrições, os apps Android não usam essas redes por padrão. Se você quiser que seu app funcione em redes de satélite restritas, identifique-o como otimizado para uso de dados de satélite e adapte os casos de uso do app para economizar recursos quando conectado a uma rede de satélite restrita.
Adaptar os casos de uso do app
Para permitir que seu app acesse redes de satélite restritas, basta ativar a opção. No entanto, talvez seja necessário fazer outras mudanças para otimizar o comportamento do app e usar os recursos de rede limitados de forma responsável. Confira algumas coisas a considerar ao otimizar para uso de dados restrito:
- Decida se o app é adequado para uso em redes restritas. Alguns apps não são adequados para redes com restrição de dados em nenhuma circunstância. Por exemplo, apps de streaming de vídeo podem optar por não usar redes de satélite, mas ainda podem identificar a presença de uma rede de satélite e informar ao usuário que não vão funcionar na rede limitada atual.
- Identifique casos de uso específicos para limitar ou modificar. Alguns recursos do seu app podem ser mais adequados para condições de dados limitados do que outros. Por exemplo, o envio de mensagens de texto funciona bem, mas tentar fazer upload de vídeos em HD provavelmente resultaria em uma experiência ruim para o usuário. Isso é semelhante à maneira como muitos apps mudam de comportamento em roaming.
- Adapte a maneira como o app usa recursos de rede. Redes restritas funcionam melhor quando os apps realizam operações de rede em bursts e passam a maior parte do tempo sem usar a rede. Evite criar tráfego de rede constante ou excessivo. Por exemplo, o áudio push-to-talk é muito mais adequado para condições de rede restritas do que chamadas de áudio em tempo real.
Também há mudanças específicas que você precisa fazer se o app usa lógica de rede complexa ou o Firebase Cloud Messaging.
Se identificar como otimizado para redes restritas
Para identificar seu app como otimizado para redes restritas e ativar o uso delas, atualize o arquivo de manifesto do app com um elemento <meta-data>
da seguinte maneira:
<meta-data android:name="android.telephony.PROPERTY_SATELLITE_DATA_OPTIMIZED"
android:value="PACKAGE_NAME" />
Esse elemento permite que seu app use uma rede de satélite restrita quando ela é a única disponível. Ele também notifica o sistema de que seu app está otimizado para redes restritas, ajudando na descoberta do usuário ao listá-lo entre os apps compatíveis com satélite no app de configurações.
Mudar o comportamento em condições de dados restritas
Se você precisar mudar o comportamento do app ao usar uma rede restrita ou
se o app tiver uma lógica preexistente que usa
ConnectivityManager
para gerenciar o uso da rede, será necessário
fazer algumas mudanças no fluxo de rede.
Detectar condições de dados restritas
O objeto NetworkCapabilities
usado para solicitações de rede inclui um bit NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED
que é definido por padrão em todas as redes e removido em redes com restrição de largura de banda. Para determinar se uma rede tem restrição de largura de banda, verifique se ela tem a capacidade NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED
.
Trabalhar com redes restritas
Os objetos NetworkRequest
também incluem a capacidade NET_CAPABILITY_NOT_BANDWIDTH_CONSTRAINED
por padrão. Remova essa
capacidade para indicar que redes restritas são aceitáveis.
Quando você detecta que se conectou a uma rede restrita, pode adaptar os recursos do app conforme necessário:
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);
Receber mensagens do FCM em redes restritas
Se o app usa o Firebase Cloud Messaging (FCM) para receber mensagens
de um servidor de apps, você pode indicar que uma mensagem específica deve ser entregue
mesmo em redes restritas incluindo a flag bandwidth_constrained_ok
ao transmitir a mensagem para o servidor do FCM:
{
"message":{
"token":"bk3RNwTe3H0:CI2k_HHwgIpoDKCIZvvDMExUdFQ3P1...",
"notification":{
"title":"Portugal vs. Denmark",
"body":"great match!"
}
"android": {
"bandwidth_constrained_ok": true
}
}
}
Se uma mensagem não incluir essa flag, o servidor do FCM só a entregará quando o dispositivo estiver conectado por uma rede sem restrições.