android: determina el tipo de seguridad de las redes wifi en el rango (sin conectarse a ellas)

Puedo enumerar todas las redes wifi en el rango (usando startScan + SCAN_RESULTS_AVAILABLE_ACTION + getScanResults) y obtener sus valores de SSID y BSSID, pero no puedo encontrar la manera de determinar el tipo de seguridad de cada red.

En mi objeto principal:

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

En mi objeto scanReceiver:

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

Y de nuevo en mi objeto principal:

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

El código funciona en la medida en que finalmente se llama a scanComplete, y puedo enumerar con éxito todas las redes wifi cercanas y obtener su SSID y BSSID, pero no entiendo cómo determinar su tipo de seguridad.

¿Hay alguna forma de hacer esto?

Gracias por adelantado.

Creo que puedes encontrarlo en el código fuente de Settings.apk.

Primero debe llamar a wifiManager.getConfiguredNetworks() o wifiManager.getScanResults() , luego use los dos métodos siguientes: (búsquelos en la 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; } 

Espero que esto sea útil.

Debe analizar la cadena de capacidades de ScanResult en el método scanComplete. De acuerdo con la documentación del desarrollador de Android,:

ScanResult.capabilities describe la autenticación, la administración de claves y los esquemas de encriptación admitidos por el punto de acceso.

Es posible que pueda utilizar, o al menos utilizar como ejemplo, los métodos de ayuda estáticos disponibles en la clase AccessPointState.

  • AccessPointState.getScanResultSecurity
  • AccessPointState.isEnterprise

Muchas gracias, … hiciste mi día …

Tengo algo para agregar aquí. Sin escanear las redes, uno puede obtener la información de configuración wifi actualmente conectada (especialmente cifrado y administración de claves) de la siguiente manera:

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

El tipo de seguridad de cada red se encuentra en la columna Capacidades de los resultados del análisis.

Entonces, para obtener el tipo de seguridad para usted, agregue esto a su parte de su código.

 public void scanComplete() { List 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.. } } } 

De todos modos, aquí hay un código fuente rápido. Recomiendo totalmente la respuesta de Ayj, ya que es una respuesta excepcional y más completa.