במכשירים עם Android 10 (API ברמה 29) ומעלה, אפשר להשתמש ב-API חדש של עמית לעמית כדי לאתחל את התצורה של מכשירים משניים כמו 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()
באובייקט של הקריאה החוזרת. אם המשתמש דוחה את הבקשה או אם החיבור לרשת לא מצליח, הפונקציהNetworkCallback.onUnavailable()
מופעלת באובייקט של הקריאה החוזרת.
כשמתחילים את הבקשה להתחבר למכשיר עמית, נפתחת תיבת דו-שיח באותו מכשיר, שבה המשתמש במכשיר יכול לאשר את בקשת החיבור.
דילוג על אישור המשתמש
אחרי שהמשתמש מאשר לאפליקציה ספציפית להתחבר לרשת בתגובה לבקשה, האישור נשמר במכשיר לנקודת הגישה הספציפית. אם האפליקציה שולחת בקשה ספציפית להתחבר שוב לנקודת הגישה הזו, המכשיר מדלג על שלב אישור המשתמש ומתחבר לרשת באופן אוטומטי. אם המשתמש יבחר להגדיר שהמכשיר ישכח את הרשת בזמן שהוא מחובר לרשת שהתבקשה על ידי ה-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);