Connectivity Diagnostics API

Mit der Connectivity Diagnostics API können Apps, die Netzwerke besitzen oder verwalten, z. B. Apps von Mobilfunkanbietern, VPN-Apps und WLAN-Vorschlags-Apps, diagnostische Informationen zur Netzwerkverbindung vom Framework erhalten. Diese Apps können Rückrufe registrieren und Benachrichtigungen mit Verbindungsinformationen für die Netzwerke empfangen, die ihnen gehören oder die sie verwalten. Apps erhalten keine Benachrichtigungen für Netzwerke, die nicht der App gehören oder von ihr verwaltet werden.

Hier einige Beispiele für Apps, die Netzwerke verwalten oder deren Inhaber sind:

  • Apps von Mobilfunkanbietern:Mobilfunknetze verwalten, für die ihr subId Anbieterberechtigungen hat
  • Apps für WLAN-Vorschläge:Eigene WLANs, die sie dem System vorschlagen
  • VPN-Apps:Verwalten alle Netzwerke, die von ihrem VPN verwendet werden, aber nur, wenn sie das aktive VPN sind.

Rückrufe werden in den folgenden Fällen aufgerufen:

  • Netzwerkvalidierung:Das System hat die Bewertung eines bestimmten Netzwerks abgeschlossen. Die Klasse ConnectivityReport enthält Informationen zum aktuellen Status des Netzwerks und zu den Ergebnissen aller Tests oder Verfahren, die im Rahmen der Validierung durchgeführt wurden.

    public class ConnectivityReport {
        Network network;
        long reportTimestamp;
        LinkProperties linkProperties;
        NetworkCapabilities networkCapabilities;
        PersistableBundle additionalInfo;
    }
    
  • Datenstau vermutet:Es wird ein Datenstau vermutet. Das ist ein Zustand, in dem IP-Pakete nicht richtig durch das Netzwerk fließen. Die Klasse DataStallReport enthält Informationen zu vermuteten Datenstaus.

    public class DataStallReport {
        Network network;
        long reportTimestamp;
        int detectionMethod;
        LinkProperties linkProperties;
        NetworkCapabilities networkCapabilities;
        PersistableBundle stallDetails;
    }
    
  • Gemeldete Konnektivität:Eine App hat dem System Konnektivität über ConnectivityManager#reportNetworkConnectivity gemeldet. Das Netzwerk und die gemeldete Verbindung (unabhängig davon, ob die App der Meinung ist, dass das Netzwerk eine Verbindung bietet oder nicht) werden geteilt.

Implementierung

Damit eine App die Connectivity Diagnostics API verwenden kann, muss sie eine ConnectivityDiagnosticsManager-Instanz von der Plattform abrufen. Diese Instanz sollte zum Registrieren und Deregistrieren von ConnectivityDiagnosticsCallback-Implementierungen verwendet werden. Callback-Methoden, die nicht überschrieben werden, sind No-Ops.

Unten sehen Sie ein Beispiel für die Implementierung von 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
        ... 
    }
}

Rufen Sie registerConnectivityDiagnosticsCallback auf, um Rückrufe zu registrieren und Benachrichtigungen zu erhalten. Wenn Sie die Registrierung von Rückrufen aufheben und keine Benachrichtigungen mehr erhalten möchten, rufen Sie unregisterConnectivityDiagnosticsCallback auf.

Unten sehen Sie ein Beispiel für die Registrierung und Deregistrierung von 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);

Zertifizierungsstufe

Die Connectivity Diagnostics API wird vom CTS durch ConnectivityDiagnosticsManagerTest getestet.