Konnektivitätsdiagnose-API

Mit der Konnektivitätsdiagnose-API können Apps, die Netzwerke besitzen oder verwalten, wie z. B. Netzbetreiber-Apps, VPN-Apps und Wi-Fi-Vorschlags-Apps, Diagnoseinformationen zur Netzwerkkonnektivität vom Framework erhalten. Diese Apps können Rückrufe registrieren und Benachrichtigungen mit Konnektivitätsinformationen für die Netzwerke empfangen, die sie besitzen oder verwalten. Apps erhalten keine Benachrichtigungen für Netzwerke, die nicht Eigentum der App sind oder von ihr verwaltet werden.

Im Folgenden finden Sie Beispiele für Apps, die Netzwerke verwalten oder besitzen:

  • Mobilfunkanbieter-Apps: Verwalten Sie Mobilfunknetze, für die ihre subId Mobilfunkanbieterrechte hat
  • WLAN-Vorschlags-Apps: Eigene WLAN-Netzwerke, die sie dem System vorschlagen
  • VPN-Apps: Verwalten Sie alle Netzwerke, die ihr VPN verwendet, 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 ConnectivityReport Klasse stellt Informationen über den aktuellen Zustand des Netzwerks und die Ergebnisse aller im Rahmen der Validierung durchgeführten Tests oder Verfahren bereit.

    public class ConnectivityReport {
        Network network;
        long reportTimestamp;
        LinkProperties linkProperties;
        NetworkCapabilities networkCapabilities;
        PersistableBundle additionalInfo;
    }
    
  • Verdacht auf Datenstau: Es wird ein Datenstau vermutet, ein Zustand, bei dem IP-Pakete nicht ordnungsgemäß durch das Netzwerk fließen. Die DataStallReport Klasse stellt Informationen über vermutete Datenstaus bereit.

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

Implementierung

Um die Connectivity Diagnostics-API verwenden zu können, muss eine App eine ConnectivityDiagnosticsManager Instanz von der Plattform abrufen. Diese Instanz sollte zum Registrieren und Aufheben der Registrierung ConnectivityDiagnosticsCallback Implementierungen verwendet werden. Rückrufmethoden, die nicht überschrieben werden, sind No-Ops.

Nachfolgend finden Sie ein Beispiel für eine ConnectivityDiagnosticsCallback Implementierung:

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
        ... 
    }
}

Um Rückrufe zu registrieren und Benachrichtigungen zu erhalten, rufen Sie registerConnectivityDiagnosticsCallback auf. Um die Registrierung von Rückrufen aufzuheben und den Empfang von Benachrichtigungen zu beenden, rufen Sie unregisterConnectivityDiagnosticsCallback auf.

Nachfolgend finden Sie ein Beispiel für die Registrierung und Aufhebung der Registrierung 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);

Validierung

Die Connectivity Diagnostics API wurde von ConnectivityDiagnosticsManagerTest CTS-getestet.