Как программно узнать, что устройство работает в режиме Wi-Fi точки доступа?
Как можно средствами Java узнать, что телефон находиться в режиме «точка доступа»? Мне необходимо узнать, раздаёт ли телефон Wi-Fi / подключен ли к нему. Вот код на проверку подключения к Wi-Fi:
public boolean isWiFiOn() < final WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); if(wifi != null) switch(wifi.getWifiState()) < case(WifiManager.WIFI_STATE_DISABLED): case(WifiManager.WIFI_STATE_DISABLING): return false; default: return true; >return false; >
Но этот код возвращает false , если телефон в режиме точки доступа. Как в таком случае узнать, раздаёт ли он Wi-Fi?
1 ответ 1
Официально узнать нельзя, но Android на то и «андроид», что много чего можно сделать при помощи хаков:
Есть спрятанный @hide метод getWifiApState :
Method method = wifiManager.getClass().getDeclaredMethod("getWifiApState"); method.setAccessible(true); int actualState = (Integer) method.invoke(wifiManager, (Object[]) null);
Далее actualState сравниваем с такими константами:
public static int WIFI_AP_STATE_DISABLING = 10; //выключается public static int WIFI_AP_STATE_DISABLED = 11; //выключен public static int WIFI_AP_STATE_ENABLING = 12; //включается public static int WIFI_AP_STATE_ENABLED = 13; //включен public static int WIFI_AP_STATE_FAILED = 14; //сломалсо
UPD: ссылка на метод в исходниках:
Получить информацию о Wi-Fi программно на Android на Java.
Чтобы получить информацию о точке доступа Wi-Fi (также известное как SSID или идентификатор набора услуг) с помощью языка программирования Java в приложении Android, вам следует использовать Android Wi-Fi API. Это API позволяет получить доступ к функциям Wi-Fi устройства Android, включая сканирование доступных сетей Wi-Fi, подключение к сети Wi-Fi и получение SSID подключенной в данный момент сети Wi-Fi.
@android_its – уроки по Android разработке с нуля до профи в телеграме.
Вот пример того, как получить имя точки доступа Wi-Fi в приложении Android с помощью Java:
1. Во-первых, вам нужно будет добавить разрешения в файл AndroidManifest.xml. Эти разрешения позволяют вашему приложению получать доступ к функциям Wi-Fi устройства.
2. Далее вам нужно будет импортировать следующие классы:
import android.net.wifi.WifiManager; import android.net.wifi.WifiInfo;
3. В Activitty или Fragment получите ссылку на объект WifiManager:
WifiManager wifiManager = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE)
4. Используйте объект WifiManager для получения объекта WifiInfo, который содержит информацию о подключенной в данный момент сети WiFi:
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
Используйте объект WifiInfo, чтобы получить SSID подключенной в данный момент сети Wi-Fi:
String wifiname = wifiInfo.getSSID();
Если устройство в данный момент не подключено к сети Wi-Fi, метод getSSID() вернет нулевое значение. Также в результате getSSID могут быть кавычки, что выглядит не очень красиво, их тоже лучше убрать. Я резюмирую все шаги в следующем примере:
public String myGetWifiName(Context context) < String wifiname = null; try < WifiManager manager = (WifiManager) context.getApplicationContext().getSystemService(WIFI_SERVICE); if (manager.isWifiEnabled()) < WifiInfo wifiInfo = manager.getConnectionInfo(); if (wifiInfo != null) < NetworkInfo.DetailedState state = WifiInfo.getDetailedStateOf(wifiInfo.getSupplicantState()); if (state == NetworkInfo.DetailedState.CONNECTED || state == NetworkInfo.DetailedState.OBTAINING_IPADDR) < wifiname = wifiInfo.getSSID(); if (wifiname.startsWith("\"") && wifiname.endsWith("\"")) wifiname = wifiname.substring(1, wifiname.length() - 1); Log.d("WifiName", "WifiName is: " + wifiname); return wifiname; >> > > catch (Exception e) < >return ""; >
В некоторых случаях ваш телефон может переключаться между разными сетями Wi-Fi, и лучше, чтобы ваше приложение получало уведомление об этом. Это эффективнее, чем когда ваше приложение, постоянно посылает запросы .
В этом случае вам нужно создать класс BroadcastReceiver:
public class WifiBroadcastReceiver extends BroadcastReceiver < @Override public void onReceive(Context context, Intent intent) < String action = intent.getAction(); if (WifiManager.SUPPLICANT_STATE_CHANGED_ACTION.equals(action)) < SupplicantState state = intent.getParcelableExtra(WifiManager.EXTRA_NEW_STATE); if (SupplicantState.isValidState(state) && state == SupplicantState.COMPLETED) < wifiname = myGetWifiName(context); //notified each of your listners Iterator it = mWifiListeners.iterator(); while(it.hasNext())< WiFiNameChangeListener listerner = (WiFiNameChangeListener) it.next(); listerner.wifiNameChanged(wifiname); >> > > >
А затем зарегистрируйте его в Activity:
BroadcastReceiver broadcastReceiver = new WifiBroadcastReceiver(); IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION); context.registerReceiver(broadcastReceiver, intentFilter);
Надеюсь, эта статья вам поможет!
Дайте мне знать, если у вас есть вопросы, в комментариях к посту.