首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android WiFi 掃描:正確獲取多個 AP 信號強度並存入陣列

     編輯:程式設計綜合問答

常見錯誤分析

原程式碼中,strength 變數在迴圈外初始化:

WifiInfo info = wm.getConnectionInfo();
int strength = info.getRssi(); // 取得的是「目前已連線」WiFi 的強度,固定值

導致迴圈內所有 AP 使用同一個 strength,而非各自掃描結果的強度。

正確做法:使用 ScanResult.getRssi()

ScanResult 類別提供 level 欄位(即 RSSI),直接在掃描結果迴圈中讀取:

完整範例:掃描指定 AP 並存入陣列

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[] 進行定位運算

關鍵點總結

  • ScanResult.level = 掃描到的 AP 信號強度 (dBm, 負值)
  • WifiInfo.getRssi() = 目前已連線 WiFi 的強度,不可用於掃描結果
  • 掃描需動態註冊 BroadcastReceiver 監聽 SCAN_RESULTS_AVAILABLE_ACTION,不可同步呼叫
  • Android 9+ 需 ACCESS_FINE_LOCATION 權限且定位服務開啟

進階建議

  • 使用 WifiManager.startScan() 觸發掃描,在 onReceive 中處理結果
  • 多次掃描取平均值,減少波動
  • 考慮使用 Android 10+ 的 WifiScanner API 獲得更精確控制
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved