Переключатель сети Android WiFi Manager при подключении к настроенной сети

Я наблюдаю интересное поведение при работе с Wifi Manager на последних версиях Android (особенно на Pixel). Я пытаюсь подключить диспетчер WIFI к известной точке доступа (устройству IOT).

Google четко перечисляет шаги в сообщении в блоге, если вы используете леденец и выше, вам необходимо привязаться к определенной сети, чтобы убедиться, что ваши сетевые запросы проходят через данную сеть. Шаги можно найти здесь https://android-developers.googleblog.com/2016/07/connecting-your-app-to-wifi-device.html

Перечисленные шаги отлично работают в обычном сценарии (вы ищите точки доступа с помощью сканирования и выполняете добавление сети, потому что это не было настроено ранее). Но если точка доступа подключена вручную из списка Wi-Fi, добавить сеть не удастся (с Android M и выше вам не разрешено изменять конфигурацию Wi-Fi, выполненную другим приложением или системой), и мне нужно подключиться к уже настроенной сети. Этот случай всегда вызывает переключение сети примерно через 20-30 секунд.

Я думаю, это вызвано https://android.googlesource.com/platform/frameworks/base/+/master/services/core/java/com/android/server/connectivity/NetworkAgentInfo.java, потому что Google звонит домой и проверяет, есть ли в сети интернет.

Но я не мог понять, почему это происходит только тогда, когда сеть ранее была подключена из Настройки -> Wi-Fi

Извините за многословный пост, если кто-то знает, почему это происходит, и если есть какой-либо способ предотвратить это, был бы очень признателен. Обратите внимание, что обновить конфигурацию Wi-Fi на M и выше невозможно. Кроме того, отключение сети тоже не помогает. Также интересно, что это происходит только с пикселем, но не на устройстве Samsung (без сетевого агента?).


person eswarm    schedule 22.01.2018    source источник


Ответы (1)


Я столкнулся с подобной проблемой.

Я могу только предположить, что ручное подключение через Настройки-> WiFi в системе Android по умолчанию считается подключением к Интернету, и если в конкретной сети Wi-Fi нет Интернета, он пытается переключить его на ту, которая имеет это подключение.

Похоже, что Google считает, что если вы используете устройство IOT - у вас должно быть приложение для обработки этого подключения и использования устройства. Приложение по умолчанию в настройках предназначено только для работы в Интернете.

Кажется, что это стандартное поведение чистого Android. Я предполагаю, что Samsung (и, возможно, некоторые другие) изменили это поведение намеренно, поскольку у них есть множество устройств, которые можно подключить таким образом к телефону из своей линии умного дома - просто для того, чтобы это было более комфортно для конечных пользователей.

С точки зрения разработчиков - мало что можно сделать, так как проприетарность и прочее ...

Но всегда есть способ попробовать.

Самым очевидным из них является использование отражения и обычных операций для изменения поведения NetworkAgentInfo.java - изменение продолжительности и избегание подобных вещей и т.п.

Подход с отражением может использоваться для изменения поведения WifiManager - например, вы можете вызвать метод forgetNetwork(int netId) через отражение и забыть о сети, если она была добавлена ​​вручную через Настройки -> WiFi, и повторно подключить ее через свое приложение. Вы можете сделать его настолько тихим, насколько это возможно, чтобы пользователь не узнал об этой скрытой кухне.

Обратной стороной размышлений является то, что вам, возможно, придется создавать разные подходы для разных версий Android и даже для разных устройств (надеюсь, нет).

Если вы разрабатываете для конкретного устройства - рутируйте его и измените настройки WiFi по умолчанию - это очень радикальное решение и очень ограничивающее. Также потребуется немало времени на обучение, чтобы знать свой путь в .smali инфраструктуре.

Еще одна вещь - вы можете использовать Wi-Fi Direct, если ваш телефон и устройство поддерживают этот протокол через WifiP2pManager. Я не буду особо останавливаться на этом вопросе, потому что он зависит от устройства.

И последнее, но не менее важное - вы можете создать «изящный ниспадающий» поток. Это означает, что в случае описанной ситуации вы будете к ней готовы - создайте в своем приложении поток, который проведет вашего пользователя через ручное решение проблемы. Думаю, это и есть самый правильный способ. Но в то же время он самый недружелюбный к пользователю. (Я использовал этот подход в своем приложении - я попросил пользователя забыть о месте вручную и еще раз просканировать его внутри приложения ... (я знаю, хромой))

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

person Pavlo Ostasha    schedule 24.09.2019