Как сохранить сеть Wi-Fi EAP в Android 10 после подготовки Android Enterprise

До уровня API 29 мы использовали WifiConfiguration для настройки Wi-Fi-соединений с нашим DPC (как в режиме устройства, так и в режиме владельца профиля). Начиная с уровня API 29, мы все еще можем сохранять сети Open, WEP, WPA, но любая попытка сохранения сети EAP полностью игнорируется. Мы попытались использовать метод WifiSuggestions, и предложение правильно отображается в панели уведомлений, но когда пользователь нажимает "разрешить" - ничего не происходит. В журнале ошибок нет, метод addNetworkSuggestions() возвращает STATUS_NETWORK_SUGGESTIONS_SUCCESS.

Эта проблема существует только тогда, когда нашему DPC предоставлены разрешения владельца устройства / профиля с полным процессом подготовки (создание рабочего профиля или полное управление во время первого запуска). Получение статуса владельца устройства с помощью ADB позволяет нам сохранить сеть, разрешив сетевое предложение.

Вот как мы настраиваем сетевое предложение:

@RequiresApi(api = Build.VERSION_CODES.Q)
public static WifiNetworkSuggestion setupWifiNetworkSuggestion (WifiConfiguration wifiConfiguration){
  return new WifiNetworkSuggestion.Builder()
          .setSsid(wifiConfiguration.SSID)
          .setIsHiddenSsid(wifiConfiguration.hiddenSSID)
          .setWpa2EnterpriseConfig(wifiConfiguration.enterpriseConfig)
          .build();
}

после этого звоним:

List<WifiNetworkSuggestion> networkSuggestionList = new ArrayList<>();
networkSuggestionList.add(setupWifiNetworkSuggestion(wifiConfiguration));

int status = mWifiManager.addNetworkSuggestions(networkSuggestionList);

if (status != WifiManager.STATUS_NETWORK_SUGGESTIONS_SUCCESS) {
  _logger.error("Problem adding network suggestion, status code: " + status);
}

Мы что-то упускаем? Тот же код работает в нашем другом приложении, где мы не используем подготовку EMM для получения владельца устройства. Все запрошенные разрешения одинаковы в обоих приложениях. Мы пытались получить информацию об ошибках или настроить журналы, но все время получаем только статусы успеха.

2 ответа

Решение

Наконец-то мы заставили это работать! Проблема была вызвана тремя отдельными проблемами:

  1. Нам не хватало разрешенных настроек управления ключами WifiConfiguration.KeyMgmt.WPA_EAP

  2. Наш тестовый сервер RADIUS отклоняет попытки подключения, если в конфигурации предприятия указан любой домен. Это давало нам ненужные отключения даже в тот момент, когда мы решали проблемы на стороне Android.

  3. САМОЕ ВАЖНОЕ: по какой-то причине наша политика паролей не применялась, и в тестовой среде мы используем самозаверяющие сертификаты. Без настройки хотя бы PIN-блокировки на устройстве сертификаты не могут быть прикреплены к сетевому профилю, поэтому он не может быть добавлен / подключен. Даже если сеть сохранена, в ней отсутствует сертификат, который необходимо выбрать вручную (хотя он правильно развернут в хранилище сертификатов)

Сети WiFi, добавленные с помощью addNetworkSuggestions, не отображаются в предоставляемом системой списке сохраненных сетей WiFi. Но если устройство увидит WiFi, оно добавит отметку, что эту сеть предложило то или иное приложение. Затем пользователь может подключиться с учетными данными WPA Enterprise, настроенными в коде.

Насколько я понимаю, это ожидаемое поведение, когда ничего не происходит, что пользователь мог бы видеть.

Кроме того, если вы удалите приложение, предлагаемые сети снова исчезнут.

Как владелец устройства, вы должны иметь возможность использоватьWifiManager.AddNetwork()метод добавления сети в системный список. Я не проверял это на себе.

На Android 12 (но не с 10 и 11) вы можете попросить пользователя добавить сеть в системный список, используя этот код:

          var suggestionsList = new WifiNetworkSuggestion[]
    {
        networkSuggestion
    };

    Bundle bundle = new Bundle();
    bundle.PutParcelableArrayList(
        Android.Provider.Settings.ExtraWifiNetworkList, 
        suggestionsList
    );
    Intent intent = new Intent(Android.Provider.Settings.ActionWifiAddNetworks);
    intent.PutExtras(bundle);
    intent.AddFlags(ActivityFlags.NewTask);
    Android.App.Application.Context.StartActivity(intent);
Другие вопросы по тегам