API đề xuất Wi-Fi để kết nối Internet

Các thiết bị chạy Android 10 (API cấp 29) trở lên cho phép ứng dụng của bạn thêm mạng thông tin đăng nhập cho một thiết bị để tự động kết nối với điểm truy cập Wi-Fi. Bạn có thể cung cấp các đề xuất về mạng để kết nối bằng WifiNetworkSuggestion. Cuối cùng, nền tảng sẽ chọn điểm truy cập để chấp nhận dựa trên đầu vào từ ứng dụng của bạn và những người khác.

Trên Android 11 (API cấp 30) trở lên:

  • Khung này thực thi các yêu cầu về quyền sở hữu đối với doanh nghiệp dựa trên mô hình EAP-SIM đề xuất (EAP-SIM, EAP-AKA, EAP-AKA-PRIME); những đề xuất như vậy chỉ dành cho các ứng dụng đã được nhà mạng ký.
  • Đối với nội dung đề xuất do ứng dụng có chữ ký của nhà mạng cung cấp, khung này sẽ tự động gán cho họ mã mạng di động tương ứng với ký nhà mạng. Chẳng hạn nội dung đề xuất sẽ tự động tắt nếu bạn tháo SIM tương ứng khỏi thiết bị.

Trên Android 12 (API cấp 31) trở lên:

  • Có thể bật quyền riêng tư bổ sung thông qua việc sắp xếp ngẫu nhiên địa chỉ MAC không ổn định, Trình này sẽ định kỳ sắp xếp lại địa chỉ MAC ngẫu nhiên. Sử dụng setMacRandomizationSetting để chỉ định mức độ ngẫu nhiên cho mạng của bạn.

  • isPasspointTermsAndConditionsSupported(): Điều khoản và điều kiệnKhoá truy cập cho phép triển khai mạng để thay thế các trang xác thực không an toàn, Mạng này sử dụng mạng mở với mạng Passpoint bảo mật. Một thông báo là hiển thị cho người dùng khi người dùng cần chấp nhận các điều khoản và điều kiện. Ứng dụng đề xuất các mạng Passpoint chịu sự kiểm soát của các điều khoản và điều kiện phải gọi API này trước để đảm bảo rằng thiết bị hỗ trợ chức năng đó. Nếu thiết bị không hỗ trợ tính năng này, thiết bị sẽ không thể kết nối với mạng này, đồng thời bạn phải đề xuất một mạng thay thế hoặc mạng cũ.

  • isDecoratedIdentitySupported(): Khi xác thực với các mạng bằng trang trí tiền tố, hình ảnh tiền tố danh tính cho phép nhà cung cấp dịch vụ mạng cập nhật Quyền truy cập mạng Định danh (NAI) để thực hiện định tuyến rõ ràng thông qua nhiều proxy bên trong của một mạng AAA (xem RFC 7542 cho về vấn đề này).

    Android 12 triển khai tính năng này theo quy cách của WBA về PPS-MO tiện ích. Ứng dụng đề xuất mạng Passpoint cần phải có danh tính được trang trí phải hãy gọi API này trước để đảm bảo rằng thiết bị hỗ trợ tính năng đó. Nếu thiết bị không hỗ trợ tính năng này, danh tính sẽ không được trang trí và việc xác thực mạng có thể không thành công.

Để tạo đề xuất Passpoint, ứng dụng phải sử dụng PasspointConfiguration! CredentialHomeSp lớp học. Các các lớp mô tả cấu hình Passpoint được định nghĩa trong Wi-Fi Alliance Passpoint (Khoá truy cập) .

Mã mẫu sau đây cho biết cách cung cấp thông tin đăng nhập cho một tài khoản đang mở, WPA2, một mạng WPA3 và một mạng 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);

Ngay sau khi ứng dụng đưa ra đề xuất lần đầu tiên, người dùng thông báo. Loại thông báo phụ thuộc vào phiên bản Android đang chạy trên thiết bị:

  • Trên Android 11 (API cấp 30) trở lên, người dùng sẽ thấy một hộp thoại nếu ứng dụng chạy ở nền trước và một thông báo nếu ứng dụng đang chạy trong nền.
  • Trên Android 10 (API cấp 29), người dùng thấy một thông báo, bất kể ứng dụng đang chạy ở chế độ nền trước hay nền sau.

Khi nền tảng kết nối với một trong các mạng đề xuất, các chế độ cài đặt sẽ xuất hiện văn bản chỉ định kết nối mạng cho ứng dụng đề xuất tương ứng.

Xử lý các lượt ngắt kết nối của người dùng

Nếu người dùng sử dụng bộ chọn Wi-Fi để ngắt kết nối một cách rõ ràng khỏi một trong mạng được đề xuất khi được kết nối với mạng đó thì mạng đó sẽ bị bỏ qua khi vẫn trong phạm vi. Trong thời gian này, mạng đó sẽ không được xem xét để tự động kết nối, ngay cả khi ứng dụng xoá và thêm lại đề xuất mạng tương ứng với mạng. Nếu người dùng sử dụng bộ chọn Wi-Fi để rõ ràng kết nối với một mạng đã bị ngắt kết nối trước đó, thì mạng đó sẽ được ngay lập tức được cân nhắc tự động kết nối.

Thay đổi trạng thái phê duyệt cho ứng dụng

Việc người dùng từ chối thông báo đề xuất mạng sẽ xóa Quyền CHANGE_WIFI_STATE từ ứng dụng. Người dùng có thể chấp thuận này sau bằng cách chuyển đến trình đơn kiểm soát Wi-Fi (Cài đặt > Ứng dụng và thông báo > Ứng dụng đặc biệt truy cập > Điều khiển Wi-Fi > App name).