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:
Utwórz specyfikator sieci Wi-Fi za pomocą
WifiNetworkSpecifier.Builder
.Ustaw filtr sieci, aby dopasować sieci, z którymi chcesz się połączyć, oraz wymagane dane logowania.
Określ kombinację parametrów
SSID
,SSID pattern
,BSSID
iBSSID 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
lubBSSID pattern
- Każde żądanie może zawierać tylko jedną z tych właściwości
SSID
lubSSID pattern
- Każde żądanie może zawierać tylko jedną z tych właściwości
BSSID
lubBSSID pattern
- Każda prośba powinna zawierać co najmniej jedną z tych właściwości:
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 jestNetworkCallback.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);