Lưu mạng và cấu hình Passpoint

Trên Android 11 (SDK cấp 30) trở lên, các ứng dụng có thể dùng ý định android.provider.Settings.ACTION_WIFI_ADD_NETWORKS để hướng dẫn người dùng thêm một hoặc nhiều mạng đã lưu mới hoặc cấu hình Passpoint. API này cũng hoạt động như bình thường để sửa đổi các cấu hình đã lưu hiện có.

Để lưu một mạng hoặc cấu hình Passpoint, hãy làm như sau:

  1. Tạo một ý định ACTION_WIFI_ADD_NETWORKS.

  2. Tạo một hoặc nhiều cấu hình bằng cách sử dụng WifiNetworkSuggestion.Builder. Xin lưu ý rằng mặc dù bạn sử dụng WifiNetworkSuggestion, nhưng Intent API này không liên quan đến Suggestion API.

  3. Tạo một danh sách mảng có thể phân chia của các cấu hình và đính kèm danh sách đó vào ý định bằng phần bổ sung EXTRA_WIFI_NETWORK_LIST.

  4. Thực thi Activity.startActivityForResult(), truyền vào ý định.

  5. Nghe kết quả bằng lệnh gọi lại Activity.onActivityResult().

    resultCode có thể là một trong những giá trị sau:

    • Activity.RESULT_OK: cho biết người dùng đã chấp nhận các mạng được đề xuất và lưu chúng.
    • Activity.RESULT_CANCELED: cho biết người dùng đã từ chối các mạng được đề xuất.

    Nếu resultCodeRESULT_OK, thì dữ liệu Intent chứa EXTRA_WIFI_NETWORK_RESULT_LIST bổ sung, chứa một mảng mã kết quả cho biết từng cấu hình đã được lưu thành công hay chưa. Các mã kết quả có thể là:

  6. Nếu yêu cầu thành công, nền tảng sẽ kích hoạt một kết nối đến một trong các mạng mới lưu.

Mã mẫu

Mẫu mã sau đây cho biết cách lưu cấu hình mạng hoặc Passpoint.

class MainActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        ...
    }

    fun startOperation() {
        val suggestions = ArrayList<WifiNetworkSuggestion>()

        // WPA2 configuration
        suggestions.add(
                WifiNetworkSuggestion.Builder()
                        .setSsid("test111111")
                        .setWpa2Passphrase("test123456")
                        .build()
        )

        // Open configuration
        suggestions.add(
                WifiNetworkSuggestion.Builder()
                        .setSsid("test222222")
                        .build()
        )

        // Passpoint configuration
        val config = PasspointConfiguration()
        config.credential = Credential().apply {
            realm = "realm.example.com"
            simCredential = Credential.SimCredential().apply {
                eapType = 18
                imsi = "123456*"
            }
        }
        config.homeSp = HomeSp().apply {
            fqdn = "test1.example.com"
            friendlyName = "Some Friendly Name"
        }
        suggestions.add(
                WifiNetworkSuggestion.Builder()
                        .setPasspointConfig(config)
                        .build())

        // Create intent
        val bundle = Bundle()
        bundle.putParcelableArrayList(EXTRA_WIFI_NETWORK_LIST, suggestions)
        val intent = Intent(ACTION_WIFI_ADD_NETWORKS)
        intent.putExtras(bundle)

        // Launch intent
        startActivityForResult(intent, 0)
    }

    override fun onActivityResult(requestCode: Int, resultCode: Int, data: Intent?) {
        super.onActivityResult(requestCode, resultCode, data)
        if(resultCode == RESULT_OK) {
            // user agreed to save configurations: still need to check individual results
            if (data != null && data.hasExtra(EXTRA_WIFI_NETWORK_RESULT_LIST)) {
                for (code in data.getIntegerArrayListExtra(EXTRA_WIFI_NETWORK_RESULT_LIST)) {
                    when (code) {
                        ADD_WIFI_RESULT_SUCCESS ->
                            ... // Configuration saved or modified
                        ADD_WIFI_RESULT_ADD_OR_UPDATE_FAILED ->
                            ... // Something went wrong - invalid configuration
                        ADD_WIFI_RESULT_ALREADY_EXISTS ->
                            ... // Configuration existed (as-is) on device, nothing changed
                        else ->
                            ... // Other errors
                    }
                }
            }
        } else {
            // User refused to save configurations
        }
    }
}