web-dev-qa-db-ja.com

android:範囲内のwifiネットワークのセキュリティタイプを決定します(それらに接続せずに)

(startScan + SCAN_RESULTS_AVAILABLE_ACTION + getScanResultsを使用して)範囲内のすべてのwifiネットワークを列挙し、それらの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を取得できますが、セキュリティタイプを判別する方法がわかりません。

これを行う方法はありますか?

前もって感謝します。

22
Aidan64

Settings.apkのソースコードで見つけることができると思います。

最初にwifiManager.getConfiguredNetworks()またはwifiManager.getScanResults()を呼び出してから、以下の2つのメソッドを使用する必要があります:( 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;
}

これがお役に立てば幸いです。

36
huangxin

ScanCompleteメソッドでScanResultの機能文字列を解析する必要があります。 Android開発者向けドキュメント によると、:

ScanResult.capabilitiesは、アクセスポイントでサポートされている認証、キー管理、および暗号化スキームについて説明しています。

AccessPointStateクラスで使用可能な静的ヘルパーメソッドを利用できる場合があります(少なくとも例として使用できます)。

25
Jason Young

どうもありがとう、...あなたは私の日を作りました...

ここに追加するものがあります。ネットワークをスキャンしなくても、現在接続されている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);
    }
}
7
pragnesh

各ネットワークのセキュリティタイプは、スキャン結果の[機能]列にあります。

したがって、セキュリティタイプを取得するには、これをコードの一部に追加します。

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

    }
}

とにかく、ここにいくつかの簡単なソースコードがあります。それは例外的な応答であり、より完全であるため、私はAyjの答えを完全にお勧めします。

1
Dave