用於點對點連線的 Wi-Fi Network Request API

在 Android 10 (API 級別 29) 以上版本的裝置中,您可以使用新的對等互連 API 來 Chromecast 和 Google Home 等次要裝置的啟動設定 硬體這項功能可讓應用程式提示使用者變更存取權 方法是使用 WifiNetworkSpecifier敬上 描述所請求網路的屬性

如要使用這個 API,請按照下列步驟操作:

  1. 建立 Wi-Fi 網路指定碼: WifiNetworkSpecifier.Builder

  2. 設定網路篩選器來比對要連線的網路,並加上必要篩選器 憑證

  3. 決定合併 SSIDSSID pattern, BSSID, 和 BSSID pattern 是在每個要求中設定網路篩選器,需遵循下列條件 規定:

    • 每項要求都必須提供下列至少一項資訊:SSIDSSID patternBSSIDBSSID pattern
    • 每項要求只能設定 SSIDSSID pattern 其中之一
    • 每項要求只能設定 BSSIDBSSID pattern 其中之一
  4. 將指定碼加入網路要求中, NetworkCallback敬上 執行個體追蹤要求狀態。

    如果使用者接受要求,且網路連線處於 成功, NetworkCallback.onAvailable()敬上 會在回呼物件上叫用。如果使用者拒絕要求,或 網路連線失敗, NetworkCallback.onUnavailable()敬上 會在回呼物件上叫用。

啟動連線至對等互連裝置的要求之後, 相同的裝置,該裝置使用者可以接受連線要求。

略過使用者核准

使用者核准要連線的網路後,以回應來自 裝置時,裝置會儲存特定存取點的核准資訊。 如果應用程式向 就會再次連線至該存取點,裝置就會略過使用者核准階段。 並自動連線至網路如果使用者選擇忘記 連至 API 要求的網路時 應用程式與聯播網組合的核准後即撤銷,日後也會移除 要求必須經過使用者再次核准。如果應用程式 發出非特定要求 (例如使用 SSID 或 BSSID 模式),則 使用者必須核准要求。

程式碼範例

下列程式碼範例說明如何連線至具有 SSID 的開放網路 前置字串為 "test""10:03:23" 的 BSSID OUI:

Kotlin

val specifier = WifiNetworkSpecifier.Builder()
    .setSsidPattern(PatternMatcher("test", PatternMatcher.PATTERN_PREFIX))
    .setBssidPattern(MacAddress.fromString("10:03:23:00:00:00"), MacAddress.fromString("ff:ff:ff:00:00:00"))
    .build()

val request = NetworkRequest.Builder()
    .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
    .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
    .setNetworkSpecifier(specifier)
    .build()

val connectivityManager = context.getSystemService(Context.CONNECTIVITY_SERVICE) as ConnectivityManager

val networkCallback = object : ConnectivityManager.NetworkCallback() {
    ...
    override fun onAvailable(network: Network?) {
        // do success processing here..
    }

    override fun onUnavailable() {
        // do failure processing here..
    }
    ...
}
connectivityManager.requestNetwork(request, networkCallback)
...
// Release the request when done.
connectivityManager.unregisterNetworkCallback(networkCallback)

Java

final NetworkSpecifier specifier =
  new WifiNetworkSpecifier.Builder()
  .setSsidPattern(new PatternMatcher("test", PatternMatcher.PATTERN_PREFIX))
  .setBssidPattern(MacAddress.fromString("10:03:23:00:00:00"), MacAddress.fromString("ff:ff:ff:00:00:00"))
  .build();

final NetworkRequest request =
  new NetworkRequest.Builder()
  .addTransportType(NetworkCapabilities.TRANSPORT_WIFI)
  .removeCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET)
  .setNetworkSpecifier(specifier)
  .build();

final ConnectivityManager connectivityManager = (ConnectivityManager)
  context.getSystemService(Context.CONNECTIVITY_SERVICE);

final NetworkCallback networkCallback = new NetworkCallback() {
  ...
  @Override
  void onAvailable(...) {
      // do success processing here..
  }

  @Override
  void onUnavailable(...) {
      // do failure processing here..
  }
  ...
};
connectivityManager.requestNetwork(request, networkCallback);
...
// Release the request when done.
connectivityManager.unregisterNetworkCallback(networkCallback);