במכשירי 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"
ו-BSSID OUI של "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);