Android 10 (API 수준 29) 이상을 실행하는 기기에서는 앱이 네트워크를 추가할 수 있음
사용자 인증 정보를 사용하여 Wi-Fi 액세스 포인트에 자동 연결할 수 있습니다. kubectl 명령어
어떤 네트워크에 연결할지 추천
WifiNetworkSuggestion
플랫폼은 궁극적으로
앱 및 기타 요소로부터 입력을 받습니다.
Android 11 (API 수준 30) 이상:
PasspointConfiguration
프로비저닝 추천 API에서 지원됩니다. Android 11 이전에는PasspointConfiguration
프로비저닝addOrUpdatePasspointConfiguration()
를 사용해야 합니다. API에 액세스할 수 있습니다.- 프레임워크는 TLS 기반 Enterprise에 보안 요구사항 적용
제안 (EAP-TLS, EAP-TTLS, EAP-PEAP)으로
지정됩니다. 이러한 네트워크에 대한
Root CA certificate
를 설정해야 합니다. 및server domain name
.
- 프레임워크는 EAP-SIM 기반 Enterprise의 소유권 요구사항을 적용합니다. 추천 (EAP-SIM, EAP-AKA, EAP-AKA-PRIME)을 사용합니다. 이러한 추천은 이동통신사에서 서명한 앱에서만 허용됩니다.
- 이동통신사 서명 앱에서 제공하는 추천의 경우 프레임워크는 자동으로 앱의 16진수에 해당하는 이동통신사 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 프로필을 설명합니다.
다음 코드 샘플은 열린 하나, 하나에 대해 사용자 인증 정보를 제공하는 방법을 보여줍니다. WPA2, 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 선택도구를 사용하여 연결되어 있을 때 해당 네트워크는 아직 범위 내에 있습니다. 이 기간에는 앱이 네트워크 제안을 삭제했다가 다시 추가하더라도 자동 연결 시 사용 IP 주소를 반환할 수 있습니다. 사용자가 Wi-Fi 선택 도구를 사용하여 명시적으로 이전에 연결 해제된 네트워크에 연결되면 해당 네트워크는 즉시 자동 연결에 고려됩니다.
앱의 승인 상태 변경
사용자가 네트워크 제안 알림을 거부하면
앱에서 CHANGE_WIFI_STATE
권한을 요청해야 합니다. 사용자가 이 승인을 부여할 수 있습니다.
Wi-Fi 제어 메뉴 (설정 >
앱 및 알림 > 특수 앱
액세스 > Wi-Fi 제어 > App name).