На устройствах с Android 10 (уровень API 29) и более поздними версиями ОС приложение может добавлять учетные данные сети, чтобы устройство автоматически подключалось к точке доступа Wi-Fi. Вы можете предлагать сети для подключения с помощью WifiNetworkSuggestion.
Платформа выбирает точку доступа на основе данных, полученных от вашего и других приложений.
На устройствах с Android 11 (уровень API 30) и более поздними версиями ОС:
- Инициализация
PasspointConfigurationподдерживается API подсказок. До Android 11 для инициализацииPasspointConfigurationтребовалось использовать APIaddOrUpdatePasspointConfiguration(). - Фреймворк применяет требования безопасности к корпоративным сетям на основе TLS (EAP-TLS, EAP-TTLS и EAP-PEAP). Для таких сетей необходимо задать
Root CA certificateиserver domain name.
- Фреймворк применяет требования к праву собственности для корпоративных предложений на основе EAP-SIM (EAP-SIM, EAP-AKA, EAP-AKA-PRIME). Такие предложения разрешены только для приложений, подписанных оператором.
- Для предложений, предоставленных приложением с подписью оператора, фреймворк автоматически назначает идентификатор оператора, соответствующий подписи оператора приложения. Если извлечь SIM-карту из устройства, такие подсказки будут автоматически отключены.
На устройствах с Android 12 (уровень API 31) и более поздних версий:
Для дополнительной конфиденциальности можно включить непостоянную рандомизацию MAC-адресов, которая периодически меняет случайный MAC-адрес. Чтобы задать уровень рандомизации для сети, используйте параметр
setMacRandomizationSetting.isPasspointTermsAndConditionsSupported()Условия использования – это функция Passpoint, которая позволяет заменить небезопасные страницы входа, использующие открытые сети, на защищенную сеть Passpoint. Если пользователю нужно принять условия использования, он увидит уведомление. Приложения, которые предлагают сети Passpoint, ограниченные условиями использования, должны сначала вызвать этот API, чтобы убедиться, что устройство поддерживает эту функцию. Если устройство не поддерживает эту функцию, оно не сможет подключиться к сети и необходимо предложить альтернативную или устаревшую сеть.isDecoratedIdentitySupported(). При аутентификации в сетях с префиксом операторы могут обновлять идентификатор доступа к сети (NAI), чтобы выполнять явную маршрутизацию через несколько прокси-серверов в сети AAA (подробнее об этом читайте в RFC 7542).В Android 12 эта функция реализована в соответствии со спецификацией WBA для расширений PPS-MO. Приложения, которые предлагают сети Passpoint, требующие декорированного идентификатора, должны сначала вызвать этот API, чтобы убедиться, что устройство поддерживает эту функцию. Если устройство не поддерживает эту функцию, идентификатор не будет дополнен и аутентификация в сети может завершиться ошибкой.
Чтобы создать рекомендацию Passpoint, приложения должны использовать классы PasspointConfiguration, Credential и HomeSp. Эти классы описывают профиль Passpoint, который определен в спецификации Wi-Fi Alliance Passpoint.
В приведенном ниже примере кода показано, как указать учетные данные для одной открытой сети, одной сети WPA2, одной сети WPA3 и одной сети 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);
Сразу после того, как приложение впервые разместит подсказку, пользователь получит уведомление. Тип уведомления зависит от версии Android, установленной на устройстве:
- На устройствах с Android 11 (уровень API 30) и более поздними версиями ОС пользователь видит диалоговое окно, если приложение работает в активном режиме, и уведомление, если оно работает в фоновом режиме.
- В Android 10 (уровень API 29) пользователь видит уведомление независимо от того, работает ли приложение в активном или фоновом режиме.
Когда платформа подключается к одной из предложенных сетей, в настройках появляется текст, указывающий на то, что подключение к сети выполнено с помощью соответствующего приложения.
Обработка отключений пользователей
Если пользователь вручную отключится от одной из предложенных сетей, она будет игнорироваться, пока находится в зоне действия. В течение этого периода сеть не будет рассматриваться для автоматического подключения, даже если приложение удалит и повторно добавит предложение сети, соответствующее этой сети. Если пользователь вручную подключается к сети, которая ранее была отключена, она сразу же будет рассматриваться для автоматического подключения.
Изменение статуса рассмотрения приложения
Если пользователь отклонит уведомление с предложением сети, у приложения будет отозвано разрешение CHANGE_WIFI_STATE. Пользователь может предоставить это разрешение позже в меню управления Wi-Fi (Настройки > Приложения и уведомления > Специальный доступ > Управление Wi-Fi > App name).