android:确定范围内无线networking的安全types(无需连接)

我可以枚举范围内的所有无线networking(使用startScan + SCAN_RESULTS_AVAILABLE_ACTION + getScanResults)并获得他们的SSID和BSSID值,但我不知道如何确定每个networking的安全types。

在我的主要对象:

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最终被调用,我可以成功地枚举所有附近的WiFinetworking,并获得他们的SSID和BSSID,但我不知道如何确定他们的安全types。

有没有办法做到这一点?

提前致谢。

我想你可以在Settings.apk的源代码中find它。

首先,你应该调用wifiManager.getConfiguredNetworks()wifiManager.getScanResults() ,然后使用以下两种方法:(在AccessPoint class "com.android.settings.wifi"find它们):

 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; } 

希望这是有帮助的。

您需要在scanComplete方法中parsingScanResult的functionstring。 根据Android开发者文档 ,

ScanResult.capabilities描述接入点支持的authentication,密钥pipe理和encryptionscheme。

您可以使用AccessPointState类中的静态帮助器方法,或者至less可以使用它作为示例。

  • AccessPointState.getScanResultSecurity
  • AccessPointState.isEnterprise

非常感谢,你让我的一天…

我在这里添加一些东西。 在不扫描networking的情况下,可以得到当前连接的wificonfiguration信息(特别是encryption和密钥pipe理)如下,

 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); } } 

每个networking的安全types位于扫描结果的“function”列中。

所以为了得到你的安全types,把它添加到你的代码中。

 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.. } } } 

无论如何,这里有一些快速的源代码。 尽pipe如此,我会完全推荐Ayj的回答,因为这是一个特殊的回应,而且更加完整。