如何主动请求扫描
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());
}
}
首选的编码解决方案将包含 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());
}
}
如何主动请求扫描?
据我所知,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());
}
}
首选的编码解决方案将包含 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());
}
}