Android 10 (API 수준 29) 이상을 실행하는 기기에서는 앱이 기기에 네트워크 사용자 인증 정보를 추가하여 Wi-Fi 액세스 포인트에 자동 연결할 수 있습니다. WifiNetworkSuggestion
을 사용하여 연결할 네트워크를 제안할 수 있습니다.
플랫폼에서는 사용자의 앱과 다른 앱의 입력을 기반으로 수락할 액세스 포인트를 최종 선택합니다.
Android 11 (API 수준 30) 이상:
PasspointConfiguration
프로비저닝은 추천 API에서 지원됩니다. 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)에 대한 소유권 요구사항을 적용합니다. 이러한 추천은 이동통신사에서 서명한 앱에서만 허용됩니다.
- 이동통신사 서명 앱에서 제공하는 추천의 경우 프레임워크는 앱의 이동통신사 서명에 해당하는 이동통신사 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);
자바
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)로 이동하여 이 승인을 제공할 수 있습니다.