במכשירי Android מגרסה 10 (API ברמה 29) ואילך, אפשר להשתמש ב-API חדש של peer to peer כדי להפעיל את ההגדרה של מכשירים משניים כמו Chromecast וחומרה של Google Home. התכונה הזו מאפשרת לאפליקציה לבקש מהמשתמש לשנות את נקודת הגישה שאליה המכשיר מחובר, באמצעות שימוש ב-WifiNetworkSpecifier
כדי לתאר את המאפיינים של הרשת המבוקשת.
כדי להשתמש ב-API הזה:
יוצרים ספציפי רשת Wi-Fi באמצעות
WifiNetworkSpecifier.Builder
.מגדירים מסנן רשתות שמתאים לרשתות שרוצים להתחבר אליהן, יחד עם פרטי הכניסה הנדרשים.
בוחרים שילוב של
SSID
,SSID pattern
,BSSID
ו-BSSID pattern
כדי להגדיר את מסנן הרשת בכל בקשה, בכפוף לדרישות הבאות:- בכל בקשה צריך לציין לפחות אחד מהערכים הבאים:
SSID
,SSID pattern
,BSSID
אוBSSID pattern
. - בכל בקשה אפשר להגדיר רק אחד מ-
SSID
או מ-SSID pattern
- בכל בקשה אפשר להגדיר רק אחד מ-
BSSID
או מ-BSSID pattern
- בכל בקשה צריך לציין לפחות אחד מהערכים הבאים:
מוסיפים את המפרטים לבקשת הרשת יחד עם מכונה של
NetworkCallback
כדי לעקוב אחרי סטטוס הבקשה.אם המשתמש מאשר את הבקשה והחיבור לרשת מצליח, מתבצעת קריאה ל-
NetworkCallback.onAvailable()
באובייקט ה-callback. אם המשתמש דוחה את הבקשה או שהחיבור לרשת נכשל, מתבצעת קריאה ל-NetworkCallback.onUnavailable()
באובייקט ה-callback.
שליחת הבקשה להתחבר למכשיר אחר פותחת תיבת דו-שיח באותו מכשיר, שממנה המשתמש במכשיר הזה יכול לאשר את בקשת החיבור.
עקיפת אישור המשתמש
אחרי שהמשתמש מאשר רשת לחיבור בתגובה לבקשה מאפליקציה ספציפית, המכשיר שומר את האישור לנקודת הגישה הספציפית. אם האפליקציה שולחת בקשה ספציפית לחיבור שוב לנקודת הגישה הזו, המכשיר מדלג על שלב האישור של המשתמש ומתחבר לרשת באופן אוטומטי. אם המשתמש יבחר לשכוח את הרשת בזמן שהוא מחובר לרשת שביקשה ה-API, האישור שנשמר לשילוב הזה של האפליקציה והרשת יוסר, וכל בקשה עתידית מהאפליקציה תצטרך לקבל אישור שוב מהמשתמש. אם האפליקציה שולחת בקשה לא ספציפית, למשל עם דפוס SSID או BSSID, המשתמש צריך לאשר את הבקשה.
דוגמת קוד
בדוגמת הקוד הבאה מוסבר איך להתחבר לרשת פתוחה עם קידומת SSID "test"
ו-OUI של 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);