Connectivity Diagnostics API

Connectivity Diagnostics API 允许拥有或管理网络的应用(例如,运营商应用、VPN 应用和 Wi-Fi 建议应用)从框架接收网络连接诊断信息。这些应用可以注册回调,并接收有关其拥有或管理的网络的连接信息的通知。应用不会接收有关非该应用拥有或管理的网络的通知。

以下是管理或拥有网络的应用的示例:

  • 运营商应用:管理其 subId 具有运营商权限的移动网络
  • Wi-Fi 建议应用:拥有其向系统建议的 Wi-Fi 网络
  • VPN 应用:管理其 VPN 使用的所有网络,但仅限于处于活动状态的 VPN

在以下情况下会调用回调:

  • 网络验证:系统已完成对特定网络的评估。ConnectivityReport 类可提供以下方面的信息:当前网络状态以及在验证过程中执行的任何测试或流程的结果。

    public class ConnectivityReport { Network network; long reportTimestamp; LinkProperties linkProperties; NetworkCapabilities networkCapabilities; PersistableBundle additionalInfo; } 
  • 可疑数据失速:系统会怀疑存在数据失速,即 IP 数据包无法正常流经网络的情况。DataStallReport 类可提供有关疑似数据失速的信息。

    public class DataStallReport { Network network; long reportTimestamp; int detectionMethod; LinkProperties linkProperties; NetworkCapabilities networkCapabilities; PersistableBundle stallDetails; } 
  • 报告的连接:应用已通过 ConnectivityManager#reportNetworkConnectivity 向系统报告连接。已共享网络和报告的连接(无论应用认为该网络是否提供连接)。

实现

如需使用 Connectivity Diagnostics API,应用必须从平台获取 ConnectivityDiagnosticsManager 实例。此实例应该用于注册和取消注册 ConnectivityDiagnosticsCallback 实现。未被替换的回调方法为空操作。

以下是 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  ...   } } 

如需注册回调并接收通知,请调用 registerConnectivityDiagnosticsCallback。如需取消注册回调并停止接收通知,请调用 unregisterConnectivityDiagnosticsCallback

以下是注册和取消注册 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); 

验证

Connectivity Diagnostics API 已由 ConnectivityDiagnosticsManagerTest 进行 CTS 测试。