如何主动请求扫描

时间:2017-12-18 23:25:32

标签: android android-wifi wifimanager

如何主动请求扫描?

根据我的理解,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建议的那样,它可以在一个线程中完成,反复进行扫描。

2 个答案:

答案 0 :(得分:0)

正如@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());
    }
}

答案 1 :(得分:0)

首选编码解决方案会将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());
    }
}