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的回答,因为这是一个特殊的回应,而且更加完整。