อุปกรณ์ที่ใช้ Android 10 (API ระดับ 29) ขึ้นไปอนุญาตให้แอปเพิ่มข้อมูลเข้าสู่ระบบเครือข่ายเพื่อให้อุปกรณ์เชื่อมต่อกับจุดเข้าใช้งาน Wi-Fi โดยอัตโนมัติ คุณสามารถระบุคำแนะนำสำหรับเครือข่ายที่จะเชื่อมต่อได้โดยใช้ WifiNetworkSuggestion
แพลตฟอร์มจะเลือกจุดเข้าใช้งานที่จะยอมรับในท้ายที่สุดโดยอิงตามข้อมูลจากแอปของคุณและแอปอื่นๆ
ใน Android 11 (API ระดับ 30) ขึ้นไป ให้ทำดังนี้
- Suggestion API รองรับการจัดสรร
PasspointConfiguration
ก่อน Android 11 การกําหนดค่าPasspointConfiguration
ต้องใช้addOrUpdatePasspointConfiguration()
API - เฟรมเวิร์กบังคับใช้ข้อกําหนดด้านความปลอดภัยในคำแนะนำสำหรับองค์กรที่ใช้ TLS (EAP-TLS, EAP-TTLS และ EAP-PEAP) คำแนะนำสำหรับเครือข่ายดังกล่าวต้องตั้งค่า
Root CA certificate
และserver domain name
- เฟรมเวิร์กบังคับใช้ข้อกำหนดการเป็นเจ้าของสำหรับคำแนะนำขององค์กรที่ใช้ EAP-SIM (EAP-SIM, EAP-AKA, EAP-AKA-PRIME) โดยแอปที่ลงนามโดยผู้ให้บริการเท่านั้นที่อนุญาตคำแนะนำดังกล่าว
- สำหรับคำแนะนำที่แอปที่ลงนามโดยผู้ให้บริการระบุไว้ เฟรมเวิร์กจะกำหนดรหัสผู้ให้บริการให้คำแนะนำโดยอัตโนมัติ ซึ่งสอดคล้องกับการรับรองโดยผู้ให้บริการของแอป ระบบจะปิดใช้คำแนะนำดังกล่าวโดยอัตโนมัติหากนำซิมที่เกี่ยวข้องออกจากอุปกรณ์
ใน Android 12 (API ระดับ 31) ขึ้นไป
คุณเปิดใช้ความเป็นส่วนตัวเพิ่มเติมได้ผ่านการสุ่ม MAC แบบไม่ถาวร ซึ่งจะสุ่มที่อยู่ MAC แบบสุ่มใหม่เป็นระยะ ใช้
setMacRandomizationSetting
เพื่อระบุระดับการสุ่มสําหรับเครือข่ายisPasspointTermsAndConditionsSupported()
: ข้อกำหนดและเงื่อนไขคือฟีเจอร์ Passpoint ที่ช่วยให้การติดตั้งใช้งานเครือข่ายสามารถแทนที่แคพทีฟพอร์ทัลที่ไม่ปลอดภัยซึ่งใช้เครือข่ายแบบเปิดด้วยเครือข่าย Passpoint ที่ปลอดภัย ระบบจะแสดงการแจ้งเตือนต่อผู้ใช้เมื่อต้องยอมรับข้อกำหนดและเงื่อนไข แอปที่แนะนำเครือข่าย Passpoint ซึ่งมีข้อกำหนดและเงื่อนไขต้องเรียกใช้ API นี้ก่อนเพื่อให้แน่ใจว่าอุปกรณ์รองรับความสามารถดังกล่าว หากอุปกรณ์ไม่รองรับความสามารถนี้ อุปกรณ์จะเชื่อมต่อเครือข่ายนี้ไม่ได้ และต้องแนะนำเครือข่ายอื่นหรือเครือข่ายเดิมisDecoratedIdentitySupported()
: เมื่อตรวจสอบสิทธิ์กับเครือข่ายที่มีการตกแต่งคำนำหน้า คำนำหน้าระบุตัวตนที่ตกแต่งแล้วจะช่วยให้ผู้ให้บริการเครือข่ายอัปเดตตัวระบุการเข้าถึงเครือข่าย (NAI) เพื่อทำการกําหนดเส้นทางที่ชัดเจนผ่านพร็อกซีหลายรายการภายในเครือข่าย AAA ได้ (ดูข้อมูลเพิ่มเติมใน RFC 7542)Android 12 ใช้ฟีเจอร์นี้เพื่อให้เป็นไปตามข้อกำหนด WBA สำหรับส่วนขยาย PPS-MO แอปที่แนะนำเครือข่าย Passpoint ที่กำหนดให้ต้องใช้ข้อมูลประจำตัวที่มีการประดับประดาต้องเรียกใช้ API นี้ก่อนเพื่อให้แน่ใจว่าอุปกรณ์รองรับความสามารถดังกล่าว หากอุปกรณ์ไม่รองรับความสามารถนี้ ระบบจะไม่ตกแต่งข้อมูลประจำตัวและการตรวจสอบสิทธิ์กับเครือข่ายอาจล้มเหลว
หากต้องการสร้างคำแนะนำ Passpoint แอปต้องใช้คลาส PasspointConfiguration
, Credential
และ HomeSp
คลาสเหล่านี้อธิบายโปรไฟล์ Passpoint ซึ่งระบุไว้ในข้อกำหนดของ Wi-Fi Alliance สำหรับ Passpoint
ตัวอย่างโค้ดต่อไปนี้แสดงวิธีระบุข้อมูลเข้าสู่ระบบสำหรับเครือข่ายแบบเปิด 1 เครือข่าย, WPA2 1 เครือข่าย, WPA3 1 เครือข่าย และเครือข่าย Passpoint 1 เครือข่าย
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)