Android программно включить wifi
Всем снова привет! Давно я ничего не писал и вот решил сегодня выдать новый перл (:
У нас будет всего лишь один класс который будет выполнять работу, еще будет подкласс рессивер который будет коннектиться к нужной нам сети.
Для начала давайте создадим разметку и добавим препишены для приложения в манифесте. И так сначала разметка. У нас будет всего два объекта, EditText и Bitton по нажатию на которую будет производиться подключение к имени нужной сети которое вы введете в EditText.
activity_main.xml
А так же нам нужно добавить кучу премишенов для того что бы можно было работать с вайфай, интернетом, регулировать состояние вайфая, доступ к вайфаю и так далее.
Вот так будет выглядеть Манифест после редактирования:
AndroidManifest.xml
С настройками для работы мы закончили, так же скорей всего если у вас обновленный Eclipse вам понадобиться appcompat_v7 который Eclipse создает теперь после каждого создания нового проекта, это жутко бесить но без него работать наперекор всему отказывается, проект выдает кучи ошибок и все. Так что я его прикреплю к проекту как дополнительную библиотеку, и на гите он будет лежать вместе с проектом.
Теперь можем смело вставлять в MainActivity наш код который подключается к конкретной точке.
MainActivity.java
Думаю комментарии тут совершенно лишними не будут. Что мы тут делаем? В первую очередь мы создали кучу переменных для работы с Wifi, такие как конфигурации и менеджеры, они нам дают возможность полностью командовать нашим Wifi в телефоне \ планшете.
Далее мы все это инициализируем в методе init(). После чего в методе onCreate() мы сперва вызываем этот init(), а после обрабатываем нажатие на кнопку и после нажатия вызываем метод и делаем нашу булевую переменную активной которая запускает рессивер.
Все получается запутанно, а это только начало (: Думаю проследить в коде будет проще, там такие же комментарии.
Дальше переходим в сам рессивер. В нем мы сканируем все сети WiFi и получаем кокретные их имена
дальше при помощи ифа мы вытаскиваем нужное нам имя,
и подключаемся к той сети имя которой похоже на введенное из EditText
Остальные параметры важны но самое важное в принципе я описал.
Все это мы делаем в рессивере для того что бы выполнялось оно в отдельном потоке и не захламляло UI поток, да и без отдельного потока приложение просто падает с NullPointerExeption. Так что вот такие пироги.
Всем привет. Давайте вспомним, что в прошлой статье мы с Вами остановились на поиске сетей Wi-Fi и переносе их SSID-ов в кликабельный список. В этой записи рассмотрим один из способов подключения к необходимой сети из нашего приложения SmartHouse. На самом деле задача оказалась довольно непростой, начиная с версии Android 5.
Наш план действий: – рассмотреть способы подключения к сетям; – изменения в политике безопасности; – способы получения необходимых разрешений; – добавление функциональных кнопок в разрабатываемое приложение. Итак все по порядку.Для начала добавим проверку включения модуля wi-fi, если выключен — включаем.
Settings.Global.putInt (getContentResolver (), Settings.Global.CAPTIVE_PORTAL_DETECTION_ENABLED, 0); , где CAPTIVE_PORTAL_DETECTION_ENABLED должен быть глобальным параметром, который установкой в 0 избегает проверки (тестирование сервером google) wi-fi на интернет-доступ.
К сожалению в зависимости от версии Android Studio и ОС Android данная константа может быть скрыта и не поддерживаться. Из-за чего может потребоваться использовать напрямую строку «captive_portal_detection_enabled», а не константу:
Settings.Global.putInt (getContentResolver (), «captive_portal_detection_enabled», 0); Но это также может не помочь.
Есть возможность использовать adb (для изменения пользовательских настроек) , для чего необходимо иметь root-права . Этот способ я даже не пробовал использовать, т.к. нас интересует только программное решение. Так как у нас приложение должно будет вносить изменения, то нам необходимо получить разрешение WRITE_SETTINGS , что позволяет программе читать или записывать защищенные системные настройки. Данное разрешение было отменено из пользовательских приложений (как в не системных приложениях) в api23.
Итак чтобы использовать WRITE_SETTINGS необходимо:
— Прописать в манифесте <uses-permission android:name="android.permission.WRITE_SETTINGS"/>
Может потребоваться также <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>. Хотя если есть WRITE_SETTINGS то последнее не требуется. По состоянию на Android 6.0.1 CHANGE_NETWORK_STATE автоматически предоставляется при запросе в вашем файле манифеста. Вышеуказанные проверки WRITE_SETTINGS требуются только для 6.0 ;
- Вызовите Settings.System.canWrite () , чтобы узнать, имеете ли вы право на запись настроек.
— Если canWrite () возвращает false, запустите действие ACTION_MANAGE_WRITE_SETTINGS , чтобы пользователь мог согласиться, и ваше приложение действительно могло писать настройки. Это необходимо сделать один раз.
В файл активности добавим функцию проверки данного разрешения.
Начиная с android Marshmellow, нам необходимо использовать разрешения во время выполнения, которые направлены на повышение безопасности, или использовать когда это необходимо. Ниже скриншоты проверки и включения:
Разрешение для программы получили. Теперь для подключения к wi-fi используем следующую функцию:
Для подключения к беспроводной сети без интернет соединения во первых мы должны:
Ниже скриншот подсоединения телефона к модулю esp8266 и его свойства в конфигурации телефона.
Подводим итог. В выше написанной статье мы рассмотрели включение модуля Wi-Fi. Получили необходимые разрешения для чтения и записи системных настроек. Рассмотрели изменения в политике безопасности подключения к сетям. Написали и разобрали функцию подключения без интернет доступа. Добавили кнопку освобождения сети. Хочется отметить, что данный код не всегда подключает модуль, например при отсутствии мобильного интернета, приложение не будет подсоединяться. На данном этапе для дальнейшего тестирования приложения и модуля остановимся на данном коде. В будущем рассмотрим стандарт Wi-Fi Direct (Wi-Fi Peer-to-Peer). В следующей статье научимся передавать данные через модуль ESP8266 в микроконтроллер STM32 и обратно. Добавим поле для вывода информации в приложение. На этом сегодня и остановимся. Всем пока.
1- Android Wi-Fi
В Android, Wi-Fi это протокол беспроводной передачи (Wireless Network Protocol), позволяет устройствам подключиться к Internet (интернету) или подключение устройств друг к другу для обмена данных.
Точнее, Android предоставляет Wi-Fi API, приложения могут использовать данный API для управления всех аспектов связанных с подключением к Wifi, например поиск текущих сетей Wifi, добавить, сохранить, удалить сети Wifi и управлять обменявшимися данными между устройствами.
Используя Wi-Fi API в своем приложении, вы можете выполнить следующие функции:
- Сканировать (scan) для поиска готовых сетей Wifi в диапазоне.
- Позволить устройству подключиться к Internet.
- Подключить к другим устройствам через Service Discovery (Обнаружение сервисов).
- Управлять списком конфигурированных сетей.
- Управлять многими подключениями.
Начиная с Android 10.0 (API Level 29) вы не можете использовать Wi-Fi API чтобы включить/выключить (enable/disable) Wifi системы, это значит если вы хотите включить/выключить Wifi, вам нужно использовать готовые функции операционной системы.
Политика конфиденциальности для использования Wi-Fi API чтобы включить/выключить Wifi была изменена через многие версии Android. Точнее:
Android Level | Политика конфиденциальности |
Level 1 ==> Level 22 (Android < 6.0) | Нужно добавить android.permission.CHANGE_WIFI_STATE в AndroidManifest.xml. |
Level 23 ==> Level 28 (Android 6.0 - 9.x) | Нужно добавить android.permission.CHANGE_WIFI_STATE в AndroidManifest.xml, одновременно, ваше приложение должно спросить разрешение пользователя, чтобы включить/выключить Wifi системы. |
Level 29+ (Android 10.0+) | Не разрешать использовать Wi-Fi API, чтобы включить/выключить Wifi системы. |
В Android 10+ (API Level 29+), метод setWifiEnabled(boolean) больше не работает.
Чтобы получить статус Wifi, вам нужно добавить android.permission.ACCESS_WIFI_STATE в AndroidManifest.xml:
Политика конфиденциальности для сканирования (scan) текущих сетей так же была изменена через разные версии Android:
Android API Level | Политика конфиденциальности |
Level 1 ==> Level 22 (Android < 6.0) | Нужно добавить android.permission.ACCESS_COARSE_LOCATION в AndroidManifest.xml. |
Level 23+ (Android 6.0+) | Нужно добавить android.permission.ACCESS_COARSE_LOCATION в AndroidManifest.xml, одновременно ваше приложение должно спросить разрешение пользователся сканировать (scan) текущие сети. |
2- Пример WifiManager
В данном примере я покажу вам как использовать WifiManager, чтобы получить статус Wifi, сканировать текущие сети, записать детальную информацию каждой найденной сети и подключить к определенной сети в списке.
Android позволяет приложениям получать доступ для просмотра состояния доступа беспроводных соединений на очень низком уровне. Приложение может получить доступ практически ко всей информации о подключении Wi-Fi.
Информация, к которой приложение может получить доступ, включает скорость соединения в подключенной сети, IP-адрес, состояние согласования, другую информацию о сети. Приложения также могут сканировать, добавлять, сохранять, прерывать и инициировать соединения Wi-Fi.
addNetwork (конфигурация WifiConfiguration)
Этот метод добавляет новое описание сети в набор настроенных сетей.
createWifiLock (строковый тег)
Этот метод создает новый WifiLock.
Этот метод отсоединяется от текущей активной точки доступа.
enableNetwork (int netId, логическое значение disableOthers)
Этот метод позволяет связать ранее настроенную сеть.
getWifiState ()
Этот метод получает состояние Wi-Fi включен
isWifiEnabled ()
Этот метод возвращает, включен ли Wi-Fi или нет.
setWifiEnabled (логическое значение включено)
Этот метод включает или отключает Wi-Fi.
Ниже приводится содержимое измененного основного файла активности src / MainActivity.java .
Ниже приводится измененное содержимое файла xml res / layout / activity_main.xml .
Ниже приводится содержимое файла AndroidManifest.xml .
Давайте попробуем запустить ваше приложение. Я предполагаю, что вы подключили свое фактическое мобильное устройство Android к компьютеру. Чтобы запустить приложение из студии Android, откройте один из файлов деятельности вашего проекта и нажмите «Выполнить». значок с панели инструментов. Перед запуском приложения Android Studio отобразит следующее окно, чтобы выбрать опцию, в которой вы хотите запустить приложение Android.
Выберите ваше мобильное устройство в качестве опции, и оно покажет следующее изображение
Теперь нажмите на кнопку «отключить Wi-Fi». Пример вывода должен быть таким:
Предположим, мы пишем игру для Android, которая подразумевает некое сетевое взаимодействие между устройствами. Причем наши устройства находятся в одной сети и мы хотим, чтобы взаимодействие между ними осуществлялось быстро, а значит вариант с обменом данными через интернет нам не подходит. Ах да, еще одна маленькая ложка дегтя — мы хотим охватить максимально возможную аудиторию, для чего нам необходимо поддерживать Android 2.3.
Что же нам делать? Давайте поговорим об этом, а заодно рассмотрим относительно новые возможности Android SDK для соединения двух и более устройств.
О чем это и для кого это?
Как-то раз, уйдя с предыдущего места работы и погрузившись в заслуженный отдых, я принялся писать сетевую игру, в которую могут играть люди, находящиеся в одной локальной сети. И сразу же столкнулся с тем, что для нормального функционирования подобной игры нам мало соорудить сетевое взаимодействие — нам нужно сделать нормальное и быстрое обнаружение устройств в сети. Собственно, в данной статье я поделюсь своим опытом в реализации решения для данной задачи.
Сразу оговорюсь, что статья предназначена в большей мере для тех, кто имеет опыт Android-разработки, написал несколько приложений и хочет расширить свой кругозор, а также улучшить профессиональные навыки.
Какие возможные способы решения существуют?
-
. Простой и эффективный способ обнаружения устройств. На Android Developer есть пошаговое руководство по подключению NSD, есть пример NsdChat, который можно скачать там же. Но есть один существенный минус — данный метод поддерживается только начиная с API Level 16, то есть с Android 4.1 Jelly Bean;
- Второе решение, предлагаемое нам на сайте Android Developer — Wi-Fi Peer-to-Peer. Проблема этого метода та же самая — поддерживается он только начиная с API Level 16;
- Есть странное решение, которое предлагается некоторыми программистами на Stack Overflow — самостоятельно сканировать локальную сеть на предмет наличия сервера. То есть проходить по всем адресам сети. Это уже сейчас звучит как странный велосипед, а теперь представьте, что порт нашего сервера назначается автоматически. Таким образом, сканирование даже самую небольшой сети становится достаточно долгой и трудоемкой задачей;
- Наконец, мы можем обратить внимание на Java-библиотеки и написать что-нибудь с их использованием. Например, JmDNS.
Я вооружился JmDNS и решил попробовать соорудить несколько классов, которые по максимуму упростят написание описанных выше приложений. Но для начала пришлось немного повырезать дубликаты .class-файлов из jar-пакета JmDNS (проблема описана здесь):
Далее я взял исходный код NsdChat с Android Developer и изменил его служебный класс, который отвечает за инициализацию сокетов и организацию сетевого взаимодействия. Также я написал wrapper для JmDNS
- startServer для создания сервера и регистрации соответствующего сервиса в локальной сети;
- findServers для поиска серверов;
- reset для окончания работы с Network Discovery и последующего освобождения ресурсов;
- wifiLock для запроса блокировки Wi-Fi.
И, наконец, метод для обнаружения и подключения к серверу:
Как видите, все очень просто. А главное, все это работает в любой версии Android для максимум двух устройств. Но сделать так, чтобы это работало для условно неограниченного числа устройств очень легко, и очевидное решение придет к вам почти сразу после детального изучения класса Connection. Пусть это будет в качестве домашнего задания.
Ах, да, весь код доступен для изучения и использования всеми желающими в моем репозитории на GitHub.. И, конечно, не исключаю то, что некоторые вещи можно сделать лучше и проще, поэтому не стесняйтесь форкать и делать pull request'ы.
Читайте также: