我目前正在嘗試在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到設置應用程序中的列表與具有最佳信號的應用程序名稱相同,因此我最終得到大量重複項,而實際上並未附加到它們。
任何人都可以指出我更好的解決方案嗎?