如何主动请求扫描?
根据我的理解,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建议的那样,它可以在一个线程中完成,反复进行扫描。
答案 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)
首选编码解决方案会将Handler
与postDelayed
合并而不是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());
}
}