A API Connectivity Diagnostics permite que apps que possuem ou gerenciem redes, como apps de operadora, VPN e sugestões 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 eles possuem ou gerenciam. Os apps não vão receber notificações de redes que não são de propriedade ou gerenciadas pelo app.
Confira abaixo exemplos de apps que gerenciam ou possuem redes:
- Apps da operadora:gerencie redes celulares para as quais o
subId
tem privilégios de operadora. - Apps de sugestão de Wi-Fi:têm redes Wi-Fi próprias que sugerem ao sistema.
- Apps de VPN:gerenciam todas as redes que a VPN usa, mas apenas quando ela é a VPN ativa.
Os callbacks são invocados nos seguintes casos:
Validação de rede:o sistema terminou de avaliar uma rede específica. A classe
ConnectivityReport
fornece informações sobre o estado atual da rede e os resultados de todos os testes ou procedimentos realizados como parte da validação.public class ConnectivityReport { Network network; long reportTimestamp; LinkProperties linkProperties; NetworkCapabilities networkCapabilities; PersistableBundle additionalInfo; }
Suspeição de interrupção de dados:uma interrupção de dados, uma condição em que os pacotes IP não fluem corretamente pela rede, é suspeita. A classe
DataStallReport
fornece informações sobre suspeitas de atraso de dados.public class DataStallReport { Network network; long reportTimestamp; int detectionMethod; LinkProperties linkProperties; NetworkCapabilities networkCapabilities; PersistableBundle stallDetails; }
Conectividade informada:um app informou a conectividade pelo
ConnectivityManager#reportNetworkConnectivity
ao sistema. A rede e a conectividade informada (se o app acredita que a rede fornece 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 precisa ser usada para registrar e
cancelar o registro
de implementações
ConnectivityDiagnosticsCallback
. Os métodos de callback que não são substituídos são inativos.
Confira abaixo um exemplo de uma
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 de 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
.