Trên các thiết bị Android 10 (cấp độ API 29) trở lên, bạn có thể sử dụng một API ngang hàng mới để khởi động cấu hình cho các thiết bị phụ như Chromecast và phần cứng Google Home. Tính năng này cho phép ứng dụng nhắc người dùng thay đổi điểm truy cập mà thiết bị kết nối bằng cách sử dụng WifiNetworkSpecifier để mô tả các thuộc tính của mạng được yêu cầu.
Để sử dụng API này, hãy làm như sau:
Tạo một thông số mạng Wi-Fi bằng cách sử dụng
WifiNetworkSpecifier.Builder.Đặt bộ lọc mạng để so khớp mạng cần kết nối, cùng với thông tin xác thực bắt buộc.
Quyết định kết hợp
SSID,SSID pattern,BSSIDvàBSSID patternđể đặt bộ lọc mạng trong mỗi yêu cầu, tuân theo các yêu cầu sau:- Mỗi yêu cầu phải cung cấp ít nhất một trong các giá trị
SSID,SSID pattern,BSSIDhoặcBSSID pattern - Mỗi yêu cầu chỉ có thể đặt một trong hai giá trị
SSIDhoặcSSID pattern - Mỗi yêu cầu chỉ có thể đặt một trong hai giá trị
BSSIDhoặcBSSID pattern
- Mỗi yêu cầu phải cung cấp ít nhất một trong các giá trị
Thêm thông số vào yêu cầu mạng cùng với một thực thể
NetworkCallbackđể theo dõi trạng thái của yêu cầu.Nếu người dùng chấp nhận yêu cầu và kết nối thành công với mạng, thì
NetworkCallback.onAvailable()sẽ được gọi trên đối tượng gọi lại. Nếu người dùng từ chối yêu cầu hoặc nếu kết nối với mạng không thành công, thìNetworkCallback.onUnavailable()sẽ được gọi trên đối tượng gọi lại.
Khi bạn bắt đầu yêu cầu kết nối với một thiết bị ngang hàng, một hộp thoại sẽ xuất hiện trên chính thiết bị đó. Người dùng thiết bị có thể chấp nhận yêu cầu kết nối trong hộp thoại này.
Bỏ qua sự phê duyệt của người dùng
Sau khi người dùng phê duyệt một mạng để kết nối theo yêu cầu của một ứng dụng cụ thể, thiết bị sẽ lưu trữ phê duyệt cho điểm truy cập cụ thể đó. Nếu ứng dụng đưa ra yêu cầu cụ thể để kết nối lại với điểm truy cập đó, thì thiết bị sẽ bỏ qua giai đoạn phê duyệt của người dùng và tự động kết nối với mạng. Nếu người dùng chọn quên mạng trong khi kết nối với mạng mà API yêu cầu, thì phê duyệt đã lưu trữ cho tổ hợp ứng dụng và mạng đó sẽ bị xoá và mọi yêu cầu trong tương lai từ ứng dụng phải được người dùng phê duyệt lại. Nếu ứng dụng đưa ra yêu cầu không cụ thể, chẳng hạn như với mẫu SSID hoặc BSSID, thì người dùng phải phê duyệt yêu cầu đó.
Mã mẫu
Đoạn mã mẫu sau đây cho biết cách kết nối với một mạng mở có tiền tố SSID là "test" và OUI BSSID là "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);