인터넷 연결을 위한 Wi-Fi 추천 API

Android 10 (API 수준 29) 이상을 실행하는 기기에서는 앱이 기기의 네트워크 사용자 인증 정보를 추가하여 Wi-Fi 액세스 포인트에 자동으로 연결할 수 있습니다. WifiNetworkSuggestion를 사용하여 연결할 네트워크에 대한 추천을 제공할 수 있습니다. 플랫폼은 궁극적으로 앱 및 다른 앱의 입력을 기반으로 수락할 액세스 포인트를 선택합니다.

Android 11 (API 수준 30) 및 이후 버전:

  • 프레임워크는 EAP-SIM 기반 엔터프라이즈 추천 (EAP-SIM, EAP-AKA, EAP-AKA-PRIME)에 관한 소유권 요구사항을 적용합니다. 이러한 추천은 이동통신사 서명된 앱에서만 허용됩니다.
  • 이동통신사 서명 앱에서 제공하는 추천의 경우 프레임워크는 앱의 이동통신사 서명에 상응하는 이동통신사 ID를 자동으로 할당합니다. 이러한 추천은 상응하는 SIM이 기기에서 삭제되면 자동으로 사용 중지됩니다.

Android 12 (API 수준 31) 및 이후 버전:

  • 무작위 MAC 주소를 주기적으로 다시 무작위 순서 지정하는 비지속적인 MAC 주소 무작위 순서 지정을 통해 개인 정보 보호를 강화할 수 있습니다. setMacRandomizationSetting를 사용하여 네트워크의 무작위 순서 지정 수준을 지정합니다.

  • isPasspointTermsAndConditionsSupported(): 이용약관은 네트워크 배포에서 개방형 네트워크를 사용하는 안전하지 않은 종속 포털을 안전한 Passpoint 네트워크로 대체할 수 있는 Passpoint 기능입니다. 이용약관에 동의해야 하는 경우 사용자에게 알림이 표시됩니다. 이용약관으로 관리되는 Passpoint 네트워크를 제안하는 앱은 먼저 이 API를 호출하여 기기에서 이 기능을 지원하는지 확인해야 합니다. 기기에서 이 기능을 지원하지 않으면 이 네트워크에 연결할 수 없고 대체 네트워크나 기존 네트워크를 제안해야 합니다.

  • isDecoratedIdentitySupported(): 접두사 장식이 있는 네트워크에 인증할 때 장식된 ID 접두사를 사용하면 네트워크 운영자가 네트워크 액세스 식별자(NAI)를 업데이트하여 AAA 네트워크 내부의 여러 프록시를 통해 명시적 라우팅을 실행할 수 있습니다(자세한 내용은 RFC 7542 참고).

    Android 12는 이 기능을 구현하여 PPS-MO 확장을 위한 WBA 사양을 준수합니다. 장식된 ID가 필요한 Passpoint 네트워크를 제안하는 앱은 먼저 이 API를 호출하여 기기에서 이 기능을 지원하는지 확인해야 합니다. 기기에서 이 기능을 지원하지 않으면 ID가 장식되지 않고 네트워크 인증이 실패할 수 있습니다.

Passpoint 제안을 만들려면 앱에서 PasspointConfiguration, Credential, HomeSp 클래스를 사용해야 합니다. 이러한 클래스는 Wi-Fi Alliance Passpoint 사양에 정의된 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 선택 도구를 사용하는 경우 네트워크가 여전히 범위 내에 있으면 무시됩니다. 이 기간 동안 앱이 네트워크에 상응하는 네트워크 추천을 삭제했다가 다시 추가하더라도 이 네트워크는 자동 연결 대상으로 고려되지 않습니다. 사용자가 Wi-Fi 선택 도구를 사용하여 이전에 연결 해제된 네트워크에 명시적으로 연결하면 이 네트워크는 즉시 자동 연결 대상으로 간주됩니다.

앱의 승인 상태 변경

네트워크 추천 알림을 거부하는 사용자는 앱에서 CHANGE_WIFI_STATE 권한을 삭제합니다. 사용자는 나중에 Wi-Fi 제어 메뉴 (설정 > 앱 및 알림 > 특수 앱 액세스 > Wi-Fi 제어 > App name)로 이동하여 이 권한을 부여할 수 있습니다.