2010-05-13 36 views
7

我目前正在嘗試在Android中編寫一個類,它將掃描接入點,計算哪個接入點具有最佳信號,然後連接到該接入點。Android - 如何掃描接入點並選擇最強的信號?

因此,應用程序將能夠掃描移動並附加到新的訪問點。

我有最佳信號工作的掃描和計算。

但是,當涉及到連接到最佳接入點時,我遇到了麻煩。

看來enableNetwork(netid,othersTrueFalse)是連接到接入點的唯一方法,但是這會導致問題,因爲從我的掃描結果中我無法獲得具有最強信號的接入點的ID。

這是我的代碼:


public void doWifiScan(){ 

    scanTask = new TimerTask() { 
    public void run() { 
     handler.post(new Runnable() { 
      public void run() { 
       sResults = wifiManager.scan(getBaseContext()); 
       if(sResults!=null) 
       Log.d("TIMER", "sResults count" + sResults.size()); 
       ScanResult scan = wifiManager.calculateBestAP(sResults); 
       wifiManager.addNewAccessPoint(scan); 
      } 
     }); 
    }}; 

    t.schedule(scanTask, 3000, 30000); 
} 

public ScanResult calculateBestAP(List<ScanResult> sResults){ 

    ScanResult bestSignal = null; 
     for (ScanResult result : sResults) { 
      if (bestSignal == null 
       || WifiManager.compareSignalLevel(bestSignal.level, result.level) < 0) 
      bestSignal = result; 
     } 

     String message = String.format("%s networks found. %s is the strongest. %s is the bsid", 
       sResults.size(), bestSignal.SSID, bestSignal.BSSID); 

     Log.d("sResult", message); 
     return bestSignal; 
} 

public void addNewAccessPoint(ScanResult scanResult){ 

    WifiConfiguration wc = new WifiConfiguration(); 
    wc.SSID = '\"' + scanResult.SSID + '\"'; 
    //wc.preSharedKey = "\"password\""; 
    wc.hiddenSSID = true; 
    wc.status = WifiConfiguration.Status.ENABLED;   
    wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); 
    wc.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); 
    wc.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); 
    wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); 
    wc.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); 
    wc.allowedProtocols.set(WifiConfiguration.Protocol.RSN); 
    int res = mainWifi.addNetwork(wc); 
    Log.d("WifiPreference", "add Network returned " + res); 
    boolean b = mainWifi.enableNetwork(res, false);   
    Log.d("WifiPreference", "enableNetwork returned " + b); 

} 

當我嘗試使用addNewAccessPoint(ScanResult scanResult),它只是增加了一個AP到設置應用程序中的列表與具有最佳信號的應用程序名稱相同,因此我最終得到大量重複項,而實際上並未附加到它們。

任何人都可以指出我更好的解決方案嗎?

回答

3

簡單地改變

boolean b = mainWifi.enableNetwork(res, false); 

boolean b = mainWifi.enableNetwork(res, true); 
0

更多你的問題的地步。首先,您要確定最佳信號強度的掃描結果。一旦你有了,你還應該獲得設備上已有的wifi配置列表,並確保信號最強的掃描結果尚未配置到設備中。如果是,只需啓用它,如果不是,請按照原樣創建一個新的。這將幫助您避免重複的配置。

private int findExistingNetworkConfig(String ssid) { 
    if (ssid != null && !ssid.isEmpty()) { 
     WifiManager wifiManager = (WifiManager) mContextRef.get() 
       .getSystemService(Context.WIFI_SERVICE); 
     for (WifiConfiguration wifiConfig : wifiManager 
       .getConfiguredNetworks()) { 
      if (ssid.equals(wifiConfig.SSID)) { 
       return wifiConfig.networkId; 
      } 
     } 
    } 
    // Didn't find a matching network ssid 
    return -1; 
} 

是的,在啓用網絡時一定要使用'true'參數。這將有助於確保您連接到您打算的網絡。

wifiManager.enableNetwork(mNetID, true);