API de diagnóstico de conectividade

A API Connectivity Diagnostics permite que aplicativos que possuem ou gerenciam redes, como aplicativos de operadora, aplicativos VPN e aplicativos de sugestão de Wi-Fi, recebam informações de diagnóstico de conectividade de rede da estrutura. Esses aplicativos podem registrar retornos de chamada e receber notificações com informações de conectividade das redes que possuem ou gerenciam. Os aplicativos não receberão notificações de redes que não pertencem ou não são gerenciadas pelo aplicativo.

A seguir estão exemplos de aplicativos que gerenciam ou possuem redes:

  • Aplicativos de operadora: gerencie redes celulares para as quais seu subId tenha privilégios de operadora para
  • Aplicativos de sugestão de Wi-Fi: redes Wi-Fi próprias que sugerem ao sistema
  • Aplicativos VPN: gerencie todas as redes que sua VPN usa, mas somente quando for a VPN ativa

Os retornos de chamada 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 quaisquer testes ou procedimentos realizados como parte da validação.

    public class ConnectivityReport {
        Network network;
        long reportTimestamp;
        LinkProperties linkProperties;
        NetworkCapabilities networkCapabilities;
        PersistableBundle additionalInfo;
    }
    
  • Suspeita de bloqueio de dados: há suspeita de bloqueio de dados, uma condição na qual os pacotes IP não estão fluindo adequadamente pela rede. A classe DataStallReport fornece informações sobre suspeitas de paralisação de dados.

    public class DataStallReport {
        Network network;
        long reportTimestamp;
        int detectionMethod;
        LinkProperties linkProperties;
        NetworkCapabilities networkCapabilities;
        PersistableBundle stallDetails;
    }
    
  • Conectividade relatada: um aplicativo relatou conectividade por meio de ConnectivityManager#reportNetworkConnectivity para o sistema. A rede e a conectividade relatada (se o aplicativo acredita que a rede fornece ou não conectividade) são compartilhadas.

Implementação

Para usar a API Connectivity Diagnostics, um aplicativo deve obter uma instância ConnectivityDiagnosticsManager da plataforma. Esta instância deve ser usada para registrar e cancelar o registro de implementações ConnectivityDiagnosticsCallback . Os métodos de retorno de chamada que não são substituídos são autônomos.

Abaixo está 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 retornos de chamada e receber notificações, chame registerConnectivityDiagnosticsCallback . Para cancelar o registro de retornos de chamada e parar de receber notificações, chame unregisterConnectivityDiagnosticsCallback .

Abaixo está um exemplo para registrar e cancelar o registro 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 CTS por ConnectivityDiagnosticsManagerTest .