API предложения Wi-Fi для подключения к Интернету

Устройства под управлением Android 10 (уровень API 29) и выше позволяют вашему приложению добавлять сетевые учётные данные для автоматического подключения устройства к точке доступа Wi-Fi. Вы можете предлагать варианты подключения к сети с помощью функции WifiNetworkSuggestion . Платформа в конечном итоге выбирает, какую точку доступа принять, на основе данных, полученных от вашего приложения и других устройств.

На Android 11 (уровень API 30) и выше:

  • Подготовка PasspointConfiguration поддерживается API Suggestion. До Android 11 для подготовки PasspointConfiguration требовалось использовать API addOrUpdatePasspointConfiguration() .
  • Платформа обеспечивает соблюдение требований безопасности в корпоративных предложениях на основе 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:

Котлин

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 ).