如果没有AP在范围内,WifiManager.getScanResults将返回旧结果

时间:2014-10-24 21:57:34

标签: android mobile android-wifi wifimanager

我当前项目中的代码定期调用WifiManager.startScan方法并通过BroadcastReceiver获取结果:

void setupWifiScanner() {
    final WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
    final IntentFilter filter = new IntentFilter();
    filter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
    registerReceiver(new BroadcastReceiver(){
        public void onReceive(Context c, Intent i){
            scanResultHandler(wifiManager.getScanResults());
            wifiManager.startScan();
        }
    }, filter);
    wifiManager.startScan();
}

当扫描2,5Ghz和5Ghz频段时,每隔2-3秒调用一次BroadcastReceiver;当扫描2,5Ghz频段时,每隔约800ms调用一次 - 这很好。但是,我面临一个烦人的问题。简而言之:

  • 只要范围内有AP,WifiManager.getScanResults就会返回最新数据
  • 离开该范围(例如离开市区)后,BroadcastReceiver仍会被调用,但从现在开始,getScanResults方法将始终返回最后获取的AP - 即使我距离20英里
  • 只要在范围内至少有一个新的AP,我就会突然再次获得有效数据

换句话说:getScanResults永远不会返回一个emtpy列表(应用程序启动后几秒钟的perhabs除外)。范围内有AP,返回的列表是最新的,或者范围内没有AP,列表已过期(包含最后看到的AP)。

我在Nexus 5上使用Android(4.4.4)测试,但我确信六个月前相同的代码在Galaxy Nexus上运行。

我已经了解了一个解决方法 - 只是对结果进行哈希处理,如果相同的哈希连续出现x次,我认为可以说这些数据不再有效了(至少AP的信号强度应该在多次扫描之间改变)。但也许我做错了什么,有一个简单的解决方案。感谢任何帮助。谢谢。

0 个答案:

没有答案