Interfejs Wi-Fi Network Request API do obsługi połączeń peer-to-peer

Na urządzeniach z Androidem 10 (poziom interfejsu API 29) i nowszym możesz używać nowego interfejsu API połączeń peer-to-peer do wczytywania konfiguracji urządzeń dodatkowych, takich jak Chromecast czy sprzęt Google Home. Ta funkcja umożliwia aplikacji żądanie zmiany punktu dostępu, z którym połączone jest urządzenie, za pomocą metody WifiNetworkSpecifier do opisania właściwości żądanej sieci.

Aby użyć tego interfejsu API, wykonaj te czynności:

  1. Utwórz specyfikator sieci Wi-Fi za pomocą WifiNetworkSpecifier.Builder.

  2. Ustaw filtr sieci, aby dopasować sieci, z którymi chcesz się połączyć, oraz wymagane dane logowania.

  3. Określ kombinację parametrów SSID, SSID pattern, BSSID i BSSID pattern, aby ustawić filtr sieci w każdym żądaniu zgodnie z tymi wymaganiami:

    • Każda prośba powinna zawierać co najmniej jedną z tych właściwości: SSID, SSID pattern, BSSID lub BSSID pattern
    • Każde żądanie może zawierać tylko jedną z tych właściwości SSID lub SSID pattern
    • Każde żądanie może zawierać tylko jedną z tych właściwości BSSID lub BSSID pattern
  4. Dodaj specyfikatory do żądania sieciowego wraz z instancją NetworkCallback, aby śledzić stan żądania.

    Jeśli użytkownik zaakceptuje żądanie i połączenie z siecią zakończy się powodzeniem, obiekt wywołania zwrotnego NetworkCallback.onAvailable() jest wywoływany. Jeśli użytkownik odrzuci żądanie lub połączenie z siecią nie powiedzie się, w obiekcie wywołania zwrotnego wywoływany jest NetworkCallback.onUnavailable().

Zainicjowanie żądania połączenia z urządzeniem równorzędnym powoduje otwarcie na tym samym urządzeniu okna, w którym użytkownik tego urządzenia może zaakceptować prośbę o połączenie.

Omijanie zgody użytkownika

Gdy użytkownik zatwierdzi sieć, z którą ma się połączyć w odpowiedzi na żądanie konkretnej aplikacji, urządzenie zachowa zatwierdzenie dla konkretnego punktu dostępu. Jeśli aplikacja ponownie poprosi o połączenie z tym punktem dostępu, urządzenie pomija etap zatwierdzania i automatycznie połączy się z siecią. Jeśli użytkownik postanowi zapomnieć sieć po połączeniu się z siecią żądaną przez interfejs API, to zapisane zatwierdzenie tej kombinacji aplikacji i sieci zostanie usunięte, a każde kolejne żądanie aplikacji będzie musiało zostać ponownie zatwierdzone przez użytkownika. Jeśli aplikacja wysyła nieokreślone żądanie, na przykład wykorzystuje identyfikator SSID lub wzorzec BSSID, użytkownik musi je zatwierdzić.

Przykładowy kod

Poniższy przykładowy kod pokazuje, jak połączyć się z siecią otwartą, korzystając z prefiksu SSID "test" i OUI identyfikatora BSSID "10:03:23":

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);