我创建了Wi-Fi扫描仪。它不断扫描可用的Wi-Fi网络。但是我的问题是,如果我可以实际运行扫描,为什么需要确切需要广播接收器(调用 startScan() 每x秒使用计时器)并在不创建广播接收器的情况下接收相同的结果?

这是广播接收器代码 onCreate() 方法:

i = new IntentFilter();
i.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
receiver = new BroadcastReceiver(){
    public void onReceive(Context c, Intent i){
      WifiManager w = (WifiManager) c.getSystemService(Context.WIFI_SERVICE);
      List<ScanResult> l = w.getScanResults();
      for (ScanResult r : l) {
         // do smth with results
      }
      // log results
    }
};

在按下扫描按钮后调用的扫描方法中,我有:

timer = new Timer(true);
timer.schedule(new WifiTimerTask(), 0, scanningInterval);
registerReceiver(receiver, i );

在哪里 WifiTimerTask

publlic class WifiTimerTask extends TimerTask{
    @Override
     public void run(){
         wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
         if (wifi.isWifiEnabled()) {
            wifi.startScan();
            List<ScanResult> sc = wifi.getScanResults(); 
            for (ScanResult r : l) {
               // do smth with results
            }
           // log results
          }
     }
}

关键是可以执行扫描 registerReceiver(receiver,i). 。但是,只有 scanningInterval 低于2s,然后 receiver 扫描和 startScan() 不同步。我的意思是 startScan() 结果直到 receiver 将获得新的结果。同时,在logcat中我得到了 ERROR/wpa_supplicant(5837): Ongoing Scan action.... 。好像2s是最低的扫描间隔。如果我的假设错了,请纠正我。

有帮助吗?

解决方案

你打电话时 startScan() 您不知道实际扫描将需要多长时间(一般来说,可能是1 ms或5小时)。所以你不能可靠地打电话 getScanResults() 您不知道扫描何时完成。

跟踪活动何时 getScanResults() 将返回更新扫描结果您需要订阅 SCAN_RESULTS_AVAILABLE_ACTION.

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top