如何主动请求扫描

How to actively request for scans

如何主动请求扫描?

据我所知,WifiManager API 提供的唯一方法是 startScan() 方法,它只是启动一个接收器来侦听 Wi-Fi 服务扫描.问题是扫描之间的延迟,太花时间了!如果我不移动太多,则不会收到扫描,如果我移动太多,则需要很长时间才能注意到。

有没有办法动态请求扫描?

这是我使用的代码:

    // ...
    wifi = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
    context.registerReceiver(this, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
    wifi.startScan();
}

// ...

@Override
public void onReceive(Context context, Intent intent)
{
    List<ScanResult> results = this.wifi.getScanResults();
    // ...

编辑:

如果不清楚...

onReceive方法有时会收到扫描,但时间太长。我想触发扫描,而不是等待它来。它可以在一个线程中完成,重复扫描,正如@Barns 所建议的那样。

正如@Barn 所建议的,startScan() 可用于触发扫描。

我的错误是认为此方法只启动扫描结果接收,将所有内容留给 wifi 服务。但是不,它确实会触发扫描。

所以... 这是一个愚蠢的问题,但我会把它留在这里,也许它对其他人有帮助。

代码:

    // ...
    new Thread(this).start();
}

@Override
public void run()
{
    while (true) try
    {
        this.wifi.startScan();
        Thread.sleep(2000);
    }
    catch (InterruptedException e) {
        Log.e("Location", e.getMessage());
    }
}

首选的编码解决方案将包含 HandlerpostDelayed 而不是 Thread.sleep。删除任何回调很重要!

尝试这样的事情:

private boolean continueLoop = true;
private Handler myHandler = new Handler();

private void startAutoDownloadManager() {
    try{
        Log.d(TAG, "AutoDownloadManager - Started");
        // here the delay (in this example it is effectively the interval) is 1 second
        myHandler.postDelayed(mAutoDownloadManager, 1000);
    }
    catch(Exception ex){
        Log.e(TAG, ex.getMessage());
    }
}

private Runnable mAutoDownloadManager = new Runnable() {
    public void run() {
        if(continueLoop){
            // preform the scan
            this.wifi.startScan();

            //re-trigger the call to start the scan
            startAutoDownloadManager();
        {
    }
};

// Make certain that you remove the callback when you leave the activity -- maybe in onPause()
private void stopAutoDownloadManager(){
    try{
        myHandler.removeCallbacks(mAutoDownloadManager);
    }
    catch(Exception ex){
        Log.e(TAG, ex.getMessage());
    }
}