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