A API Connectivity Diagnostics permite que apps que têm ou gerenciam redes, como apps de operadora, VPN e sugestão de Wi-Fi, recebam informações de diagnóstico de conectividade de rede do framework. Esses apps podem registrar callbacks e receber notificações com informações de conectividade das redes que possuem ou gerenciam. Os apps não recebem notificações de redes que não são de propriedade ou gerenciadas por eles.
Confira alguns exemplos de apps que gerenciam ou são proprietários de redes:
- Apps de operadora:gerencie redes celulares em que o
subId
tem privilégios de operadora. - Apps de sugestão de Wi-Fi:redes Wi-Fi próprias que eles sugerem ao sistema.
- Apps de VPN:gerenciam todas as redes usadas pela VPN, mas apenas quando ela está ativa.
Os callbacks são invocados nos seguintes casos:
Validação de rede:o sistema concluiu a avaliação de uma rede específica. A classe
ConnectivityReport
fornece informações sobre o estado atual da rede e os resultados de testes ou procedimentos realizados como parte da validação.public class ConnectivityReport { Network network; long reportTimestamp; LinkProperties linkProperties; NetworkCapabilities networkCapabilities; PersistableBundle additionalInfo; }
Suspeita de interrupção de dados:suspeita de interrupção de dados, uma condição em que os pacotes IP não fluem corretamente pela rede. A classe
DataStallReport
fornece informações sobre possíveis interrupções de dados.public class DataStallReport { Network network; long reportTimestamp; int detectionMethod; LinkProperties linkProperties; NetworkCapabilities networkCapabilities; PersistableBundle stallDetails; }
Conectividade informada:um app informou a conectividade ao sistema usando
ConnectivityManager#reportNetworkConnectivity
. A rede e a conectividade informada (se o app acredita que a rede oferece ou não conectividade) são compartilhadas.
Implementação
Para usar a API Connectivity Diagnostics, um app precisa receber uma instância
ConnectivityDiagnosticsManager
da plataforma. Essa instância deve ser usada para registrar e
cancelar o registro de
implementações do
ConnectivityDiagnosticsCallback
. Os métodos de callback que não são substituídos são operações nulas.
Confira um exemplo de implementação de
ConnectivityDiagnosticsCallback
:
public class ExampleCallback extends ConnectivityDiagnosticsCallback {
@Override
public void onConnectivityReportAvailable(@NonNull ConnectivityReport report) {
...
// Log data, take action based on report result, etc
...
}
@Override
public void onDataStallSuspected(@NonNull DataStallReport report) {
...
// Log data, take action based on report result, etc
...
}
@Override
public void onNetworkConnectivityReported(
@NonNull Network network, boolean hasConnectivity) {
...
// Log data, take action based on report result, etc
...
}
}
Para registrar callbacks e receber notificações, chame
registerConnectivityDiagnosticsCallback
.
Para cancelar o registro de callbacks e parar de receber notificações, chame
unregisterConnectivityDiagnosticsCallback
.
Confira abaixo um exemplo de registro e cancelamento do registro de
ConnectivityDiagnosticsCallback
:
NetworkRequest request =
new NetworkRequest.Builder()
.addTransportType(TRANSPORT_CELLULAR)
.build();
// Use an Executor that is appropriate for your use case
Executor executor = Executors.newSingleThreadExecutor();
ConnectivityDiagnosticsManager cdm =
context.getSystemService(ConnectivityDiagnosticsManager.class);
ExampleCallback callback = new ExampleCallback();
cdm.registerConnectivityDiagnosticsCallback(
request, executor, callback);
...
// Collect connectivity information on networks that match with request
...
cdm.unregisterConnectivityDiagnosticsCallback(callback);
Validação
A API Connectivity Diagnostics é testada pelo CTS por
ConnectivityDiagnosticsManagerTest
.