Android: определение типа безопасности беспроводных сетей в диапазоне (без подключения к ним)

Я могу перечислить все WiFi-сети в диапазоне (используя startScan + SCAN_RESULTS_AVAILABLE_ACTION + getScanResults) и получить их значения SSID и BSSID, но я не могу понять, как определить тип безопасности каждой сети.

В моем основном объекте:

IntentFilter intentFilter = new IntentFilter(); intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION); registerReceiver(scanReceiver, intentFilter); ((WifiManager)getSystemService(Context.WIFI_SERVICE)).startScan(); 

В моем объекте scanReceiver:

 public void onReceive(Context c, Intent intent) { if (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION.equals(intent.getAction())){ mainObject.scanComplete(); } } 

И снова в моем главном объекте:

 public void scanComplete() { List<ScanResult> networkList = ((WifiManager)getSystemService.(Context.WIFI_SERVICE)).getScanResults(); for (ScanResult network : networkList) { <do stuff> } } 

Код работает в том случае, если scanComplete в конечном итоге вызван, и я могу успешно перечислить все близлежащие Wi-Fi-сети и получить их SSID и BSSID, но я не могу понять, как определить их тип безопасности.

Есть ли способ сделать это?

Заранее спасибо.

Solutions Collecting From Web of "Android: определение типа безопасности беспроводных сетей в диапазоне (без подключения к ним)"

Я думаю, вы можете найти его в исходном коде Settings.apk.

Сначала вы должны вызвать wifiManager.getConfiguredNetworks() или wifiManager.getScanResults() , а затем использовать два метода ниже: (найти их в class "com.android.settings.wifi" AccessPoint class "com.android.settings.wifi" ):

 static int getSecurity(WifiConfiguration config) { if (config.allowedKeyManagement.get(KeyMgmt.WPA_PSK)) { return SECURITY_PSK; } if (config.allowedKeyManagement.get(KeyMgmt.WPA_EAP) || config.allowedKeyManagement.get(KeyMgmt.IEEE8021X)) { return SECURITY_EAP; } return (config.wepKeys[0] != null) ? SECURITY_WEP : SECURITY_NONE; } static int getSecurity(ScanResult result) { if (result.capabilities.contains("WEP")) { return SECURITY_WEP; } else if (result.capabilities.contains("PSK")) { return SECURITY_PSK; } else if (result.capabilities.contains("EAP")) { return SECURITY_EAP; } return SECURITY_NONE; } 

Надеюсь, это полезно.

Вам нужно проанализировать строку возможностей ScanResult в методе scanComplete. Согласно документации разработчика Android, выполните следующие действия:

ScanResult.capabilities описывает схемы проверки подлинности, управления ключами и шифрования, поддерживаемые точкой доступа.

Возможно, вы сможете использовать или, по крайней мере, использовать в качестве примера статические вспомогательные методы, доступные в классе AccessPointState.

  • AccessPointState.getScanResultSecurity
  • AccessPointState.isEnterprise

Большое спасибо, … ты сделал мой день …

Мне есть что добавить. Без сканирования для сетей можно получить текущую информацию о конфигурации Wi-Fi (особенно шифрование и управление ключами) следующим образом:

 WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE); List<ScanResult> networkList = wifi.getScanResults(); if (networkList != null) { for (ScanResult network : networkList) { String Capabilities = network.capabilities; Log.w (TAG, network.SSID + " capabilities : " + Capabilities); } } 

Тип безопасности каждой сети находится в столбце «Возможности» результатов сканирования.

Чтобы получить тип безопасности для вас, добавьте это в свою часть кода.

 public void scanComplete() { List<ScanResult> networkList = ((WifiManager)getSystemService.(Context.WIFI_SERVICE)).getScanResults(); for (ScanResult network : networkList) { String Capabilities = network.capabilities; //Then you could add some code to check for a specific security type. if(Capabilities.contains("WPA")) { // We know there is WPA encryption } else if(Capabilities.contains("WEP")) { // We know there is WEP encryption } else { // Another type of security scheme, open wifi, captive portal, etc.. } } } 

В любом случае, вот какой-то быстрый исходный код. Я бы полностью повторил ответ Айя, хотя, поскольку это исключительный ответ и более полный.