原程式碼中,strength 變數在迴圈外初始化:
WifiInfo info = wm.getConnectionInfo();
int strength = info.getRssi(); // 取得的是「目前已連線」WiFi 的強度,固定值
導致迴圈內所有 AP 使用同一個 strength,而非各自掃描結果的強度。
ScanResult 類別提供 level 欄位(即 RSSI),直接在掃描結果迴圈中讀取:
WifiManager wm = (WifiManager) getApplicationContext().getSystemService(Context.WIFI_SERVICE);
List results = wm.getScanResults();
// 目標 AP 列表
String[] targetSSIDs = {"9#729", "YHY", "9#731", "TP-LINK_366388"};
int[] apLevels = new int[targetSSIDs.length];
float[] distances = new float[targetSSIDs.length];
for (ScanResult result : results) {
for (int i = 0; i < targetSSIDs.length; i++) {
if (targetSSIDs[i].equals(result.SSID)) {
// 取得該 AP 的實際信號強度 (RSSI, 負值)
int rssi = result.level;
apLevels[i] = -rssi; // 轉為正數方便顯示
// 簡易距離估算模型 (僅供參考)
distances[i] = (float) (0.02 * Math.pow(Math.E, (rssi * -0.1)));
break;
}
}
}
// 後續可使用 apLevels[] 和 distances[] 進行定位運算
BroadcastReceiver 監聽 SCAN_RESULTS_AVAILABLE_ACTION,不可同步呼叫ACCESS_FINE_LOCATION 權限且定位服務開啟WifiManager.startScan() 觸發掃描,在 onReceive 中處理結果WifiScanner API 獲得更精確控制