במכשירים עם Android 10 (רמת API 29) ומעלה, האפליקציה יכולה להוסיף פרטי כניסה לרשת כדי שהמכשיר יתחבר אוטומטית לנקודת גישה ל-Wi-Fi. אתם יכולים להציע לאיזו רשת להתחבר באמצעות WifiNetworkSuggestion.
בסופו של דבר, הפלטפורמה בוחרת איזו נקודת גישה לקבל על סמך הקלט מהאפליקציה שלכם ומאפליקציות אחרות.
ב-Android 11 (רמת API 30) ואילך:
- אפשר להקצות
PasspointConfigurationבאמצעות ה-API של ההצעות. בגרסאות שקדמו ל-Android 11, כדי להקצותPasspointConfigurationצריך להשתמש ב-APIaddOrUpdatePasspointConfiguration(). - ה-framework אוכף דרישות אבטחה על הצעות לרשתות Enterprise שמבוססות על TLS (EAP-TLS, EAP-TTLS ו-EAP-PEAP). הצעות לרשתות כאלה צריכות להגדיר
Root CA certificateו-server domain name.
- המסגרת אוכפת את דרישות הבעלות על הצעות Enterprise שמבוססות על EAP-SIM (EAP-SIM, EAP-AKA, EAP-AKA-PRIME). הצעות כאלה מותרות רק באפליקציות שחתומות על ידי ספק.
- להצעות שמספקת אפליקציה שחתומה על ידי ספק, ה-framework מקצה להן באופן אוטומטי מזהה ספק שתואם לחתימת הספק של האפליקציה. ההצעות האלה מושבתות באופן אוטומטי אם כרטיס ה-SIM התואם מוסר מהמכשיר.
ב-Android מגרסה 12 (רמת API 31) ואילך:
כדי להגביר את הפרטיות, אפשר להפעיל הקצאה אקראית של כתובת MAC לא קבועה, שמשנה באופן תקופתי את כתובת ה-MAC שהוקצתה באופן אקראי. משתמשים ב-
setMacRandomizationSettingכדי לציין את רמת האקראיות של הרשת.isPasspointTermsAndConditionsSupported(): התנאים וההגבלות הם תכונה של Passpoint שמאפשרת לפריסות רשת להחליף פורטלים שבויים לא מאובטחים, שמשתמשים ברשתות פתוחות, ברשת Passpoint מאובטחת. אם המשתמש צריך לאשר את התנאים וההגבלות, מוצגת לו הודעה. אפליקציות שמציעות רשתות Passpoint שמוגבלות על ידי תנאים והגבלות צריכות לקרוא קודם ל-API הזה כדי לוודא שהמכשיר תומך ביכולת הזו. אם המכשיר לא תומך ביכולת הזו, הוא לא יוכל להתחבר לרשת הזו, וצריך להציע רשת חלופית או רשת מדור קודם.isDecoratedIdentitySupported(): כשמבצעים אימות לרשתות עם קידומת מעוטרת, הקידומת המעוטרת של הזהות מאפשרת למפעילי הרשת לעדכן את מזהה הגישה לרשת (NAI) כדי לבצע ניתוב מפורש דרך כמה שרתי proxy בתוך רשת AAA (למידע נוסף, אפשר לעיין ב-RFC 7542).ב-Android 12 התכונה הזו מוטמעת בהתאם למפרט של WBA לתוספים של PPS-MO. אפליקציות שמציעות רשתות Passpoint שדורשות זהות מעוטרת חייבות לקרוא קודם ל-API הזה כדי לוודא שהמכשיר תומך ביכולת הזו. אם המכשיר לא תומך ביכולת הזו, הזהות לא תעוטר וייתכן שהאימות ברשת ייכשל.
כדי ליצור הצעה ל-Passpoint, האפליקציות צריכות להשתמש במחלקות
PasspointConfiguration,
Credential ו-
HomeSp. המחלקה הזו מתארת את פרופיל Passpoint, שמוגדר במפרט Passpoint של Wi-Fi Alliance.
בדוגמת הקוד הבאה אפשר לראות איך מספקים פרטי כניסה לרשת פתוחה אחת, לרשת WPA2 אחת, לרשת WPA3 אחת ולרשת Passpoint אחת:
Kotlin
val suggestion1 = WifiNetworkSuggestion.Builder() .setSsid("test111111") .setIsAppInteractionRequired(true) // Optional (Needs location permission) .build(); val suggestion2 = WifiNetworkSuggestion.Builder() .setSsid("test222222") .setWpa2Passphrase("test123456") .setIsAppInteractionRequired(true) // Optional (Needs location permission) .build(); val suggestion3 = WifiNetworkSuggestion.Builder() .setSsid("test333333") .setWpa3Passphrase("test6789") .setIsAppInteractionRequired(true) // Optional (Needs location permission) .build(); val passpointConfig = PasspointConfiguration(); // configure passpointConfig to include a valid Passpoint configuration val suggestion4 = WifiNetworkSuggestion.Builder() .setPasspointConfig(passpointConfig) .setIsAppInteractionRequired(true) // Optional (Needs location permission) .build(); val suggestionsList = listOf(suggestion1, suggestion2, suggestion3, suggestion4); val wifiManager = context.getSystemService(Context.WIFI_SERVICE) as WifiManager; val status = wifiManager.addNetworkSuggestions(suggestionsList); if (status != WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS) { // do error handling here } // Optional (Wait for post connection broadcast to one of your suggestions) val intentFilter = IntentFilter(WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION); val broadcastReceiver = object : BroadcastReceiver() { override fun onReceive(context: Context, intent: Intent) { if (!intent.action.equals(WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION)) { return; } // do post connect processing here } }; context.registerReceiver(broadcastReceiver, intentFilter);
Java
final WifiNetworkSuggestion suggestion1 = new WifiNetworkSuggestion.Builder() .setSsid("test111111") .setIsAppInteractionRequired(true) // Optional (Needs location permission) .build(); final WifiNetworkSuggestion suggestion2 = new WifiNetworkSuggestion.Builder() .setSsid("test222222") .setWpa2Passphrase("test123456") .setIsAppInteractionRequired(true) // Optional (Needs location permission) .build(); final WifiNetworkSuggestion suggestion3 = new WifiNetworkSuggestion.Builder() .setSsid("test333333") .setWpa3Passphrase("test6789") .setIsAppInteractionRequired(true) // Optional (Needs location permission) .build(); final PasspointConfiguration passpointConfig = new PasspointConfiguration(); // configure passpointConfig to include a valid Passpoint configuration final WifiNetworkSuggestion suggestion4 = new WifiNetworkSuggestion.Builder() .setPasspointConfig(passpointConfig) .setIsAppInteractionRequired(true) // Optional (Needs location permission) .build(); final List<WifiNetworkSuggestion> suggestionsList = new ArrayList<WifiNetworkSuggestion> {{ add(suggestion1); add(suggestion2); add(suggestion3); add(suggestion4); }}; final WifiManager wifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); final int status = wifiManager.addNetworkSuggestions(suggestionsList); if (status != WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS) { // do error handling here… } // Optional (Wait for post connection broadcast to one of your suggestions) final IntentFilter intentFilter = new IntentFilter(WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION); final BroadcastReceiver broadcastReceiver = new BroadcastReceiver() { @Override public void onReceive(Context context, Intent intent) { if (!intent.getAction().equals( WifiManager.ACTION_WIFI_NETWORK_SUGGESTION_POST_CONNECTION)) { return; } // do post connect processing here... } }; context.registerReceiver(broadcastReceiver, intentFilter);
מיד אחרי שהאפליקציה מציגה הצעה בפעם הראשונה, המשתמש מקבל התראה. סוג ההתראה תלוי בגרסת Android שפועלת במכשיר:
- ב-Android 11 (רמת API 30) ומעלה, למשתמש מוצגת תיבת דו-שיח אם האפליקציה פועלת בחזית, והתראה אם האפליקציה פועלת ברקע.
- ב-Android 10 (רמת API 29), המשתמש רואה התראה, גם אם האפליקציה פועלת בחזית וגם אם היא פועלת ברקע.
כשהפלטפורמה מתחברת לאחת מההצעות לרשת, בהגדרות מוצג טקסט שמשייך את החיבור לרשת לאפליקציה המתאימה שהציעה את הרשת.
טיפול בניתוקים של משתמשים
אם המשתמש משתמש בבורר ה-Wi-Fi כדי להתנתק באופן מפורש מאחת מהצעות הרשת כשהוא מחובר אליה, המערכת מתעלמת מהרשת הזו כשהיא עדיין בטווח. במהלך התקופה הזו, הרשת לא תהיה מועמדת לחיבור אוטומטי, גם אם האפליקציה תסיר ותוסיף מחדש את ההצעה לרשת שתואמת לרשת הזו. אם המשתמש משתמש בבורר ה-Wi-Fi כדי להתחבר באופן מפורש לרשת שנותקה בעבר, הרשת הזו תהיה זמינה לחיבור אוטומטי באופן מיידי.
שינוי סטטוס האישור של האפליקציה
אם המשתמש דוחה את ההתראה על ההצעה לרשת, ההרשאה CHANGE_WIFI_STATE מוסרת מהאפליקציה. המשתמש יכול לתת את האישור הזה מאוחר יותר בתפריט השליטה ב-Wi-Fi (הגדרות > אפליקציות והתראות > גישה מיוחדת לאפליקציה > שליטה ב-Wi-Fi > App name).