Устройства под управлением 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
.
- Платформа обеспечивает соблюдение требований владения для предложений Enterprise на основе 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 ).
Устройства под управлением 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
.
- Платформа обеспечивает соблюдение требований владения для предложений Enterprise на основе 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 ).
Устройства под управлением 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
.
- Платформа обеспечивает соблюдение требований владения для предложений Enterprise на основе 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 ).
Устройства под управлением 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
.
- Платформа обеспечивает соблюдение требований владения для предложений Enterprise на основе 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 ).