Устройства под управлением Android 10 (уровень API 29) и выше позволяют вашему приложению добавлять учетные данные сети для автоматического подключения устройства к точке доступа Wi-Fi. Вы можете предлагать сети для подключения с помощью функции WifiNetworkSuggestion . Платформа в конечном итоге выбирает, какую точку доступа принять, на основе данных, предоставленных вашим приложением и другими пользователями.
На Android 11 (уровень API 30) и выше:
- Создание объекта
PasspointConfigurationподдерживается API подсказок. В версиях Android до 11 для создания объектаPasspointConfigurationтребовалось использование APIaddOrUpdatePasspointConfiguration(). - Данная структура обеспечивает соблюдение требований безопасности для предложений Enterprise на основе 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 с условиями авторизации, должны сначала вызвать этот API, чтобы убедиться, что устройство поддерживает эту функцию. Если устройство не поддерживает эту функцию, оно не сможет подключиться к этой сети, и будет предложена альтернативная или устаревшая сеть.isDecoratedIdentitySupported(): При аутентификации в сетях с префиксным декорированием, декорированный префикс идентификации позволяет сетевым операторам обновлять идентификатор доступа к сети (NAI) для выполнения явной маршрутизации через несколько прокси-серверов внутри сети AAA (подробнее см. RFC 7542 ).В Android 12 эта функция реализована в соответствии со спецификацией WBA для расширений PPS-MO . Приложения, предлагающие сети Passpoint, требующие помеченного идентификатора, должны сначала вызвать этот API, чтобы убедиться, что устройство поддерживает эту возможность. Если устройство не поддерживает эту возможность, идентификатор не будет помечен, и аутентификация в сети может завершиться неудачей.
Для создания предложения по точке доступа приложения должны использовать классы PasspointConfiguration , Credential и HomeSp . Эти классы описывают профиль точки доступа, определенный в спецификации Wi-Fi Alliance Passpoint .
В приведенном ниже примере кода показано, как предоставить учетные данные для одной открытой сети, одной сети WPA2, одной сети WPA3 и одной сети Passpoint:
Котлин
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 для явного подключения к сети, которая ранее была отключена, то эта сеть будет рассмотрена для автоматического подключения немедленно.
Изменение статуса одобрения приложения
Отказ пользователя от уведомления о предложении сети удаляет разрешение CHANGE_WIFI_STATE из приложения. Пользователь может предоставить это разрешение позже, перейдя в меню управления Wi-Fi ( Настройки > Приложения и уведомления > Специальный доступ к приложениям > Управление Wi-Fi > App name ).