gpt4 book ai didi

android - 我应该在 Android 上的每次 WiFi 扫描之间使用什么间隔?

转载 作者:塔克拉玛干 更新时间:2023-11-02 19:19:01 25 4
gpt4 key购买 nike

我需要定期执行 Wifi 扫描。当时间间隔设置为 1-2 秒时,我遇到了问题。似乎我没有得到任何 ScanResult。是否设置了最短时间,以便 WifiManager 能够成功执行 WiFi 扫描?

这是代码。我正在使用 Service 进行 Wifi 扫描:

public class WifiScanning extends Service{
private static final String TAG = "WifiScanning";
private Timer timer;
public int refreshRate, numberOfWifiScan, wifiScanGranularity;
WifiReceiver receiverWifi = new WifiReceiver();
WifiManager wifi;
StringBuilder sb;
List<ScanResult> wifiList;
List<APData> apdataList;
List<List<APData>>surveyData;

private TimerTask updateTask = new TimerTask() {
@Override
public void run() {
Log.i(TAG, "Timer task doing work");
wifi.startScan();
}
};
@Override
public IBinder onBind(Intent intent) {
// TODO Auto-generated method stub
return null;
}
@Override
public void onCreate() {
super.onCreate();
Log.i(TAG, "Service creating");
//retrieve the mapRefreshRate from config.xml
XMLOperations test = new XMLOperations();
Configuration config = new Configuration();
config = test.saxXmlParsing(this, 1);
if(config==null)
config = test.saxXmlParsing(this, 2);
refreshRate = Integer.parseInt(config.getMapRefreshRate());
numberOfWifiScan = Integer.parseInt(config.getNumberOfWifiScan_Positioning());
wifiScanGranularity = Integer.parseInt(config.getWifiScanGranularity_Positioning());
timer = new Timer();
Log.i(TAG, "Refresh Rate: "+ String.valueOf(refreshRate));
timer.schedule(updateTask, 0, refreshRate);
wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
registerReceiver(receiverWifi, new IntentFilter(
WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
}
@Override
public void onDestroy() {
super.onDestroy();
Log.i(TAG, "Service destroying");
unregisterReceiver(receiverWifi);
if (timer != null){
timer.cancel();
timer.purge();
timer = null;
}
}
class WifiReceiver extends BroadcastReceiver {
public void onReceive(Context c, Intent intent) {
sb = new StringBuilder();
wifiList = wifi.getScanResults();
String ap_ssid;
String ap_mac;
Double ap_rssi;
for(int i = 0; i < wifiList.size(); i++){
ap_ssid = wifiList.get(i).SSID;
ap_mac = wifiList.get(i).BSSID;
ap_rssi = Double.valueOf(wifiList.get(i).level);
APData ap = new APData(ap_ssid,ap_mac,ap_rssi);
apdataList.add(ap);
sb.append(" " + (wifiList.get(i).SSID).toString());
sb.append(" " + (wifiList.get(i).BSSID).toString());
sb.append((" " + String.valueOf(wifiList.get(i).level)));
sb.append("\n");
}
Log.d(TAG, sb.toString());
for(int i=1; i<=numberOfWifiScan; i++){
surveyData.add(apdataList);
}
}
}
}

但是,我似乎在这一行得到了 Nullpointer:apdataList.add(ap);。于是想是不是间隔太短,导致ScanResult为空?

最佳答案

发布代码后

编辑:

apdataList好像没有在onCreate()中初始化

将其添加到 onCreate() 中:

apdataList = new List<APData>();

最小扫描延迟

我认为没有绝对的最小扫描延迟。这在很大程度上取决于硬件性能。

我的建议是,您可以在首选项中添加“尽可能快”选项,然后使用异步循环,在发现新结果后立即重新启动扫描(请参阅下面的代码 fragment ,它已根据您的需要进行了更新).这样,它只会受到硬件性能的限制。


您还可以使用 WifiManager.getScanResults() 轮询 ScanResults推荐的方法是启动 WifiManager.startScan() 并为 WifiManager.SCAN_RESULTS_AVAILABLE_ACTION 设置 BroadcastReceiver,以便在扫描结果准备好后立即收到通知。

这是一个示例代码(借用 from here 并根据您的需要进行了调整):

IntentFilter i = new IntentFilter(); 
i.addAction (WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
registerReceiver(new BroadcastReceiver(){
public void onReceive(Context c, Intent i){
// Code to execute when SCAN_RESULTS_AVAILABLE_ACTION event occurs
WifiManager w = (WifiManager) c.getApplicationContext().getSystemService(Context.WIFI_SERVICE); //Use getApplicationContext to prevent memory leak
myScanResultHandler(w.getScanResults()); // your method to handle Scan results
if (ScanAsFastAsPossible) w.startScan(); // relaunch scan immediately
else { /* Schedule the scan to be run later here */}
}
}, i );


// Launch wifiscanner the first time here (it will call the broadcast receiver above)
WifiManager wm = (WifiManager)getApplicationContext.getSystemService(Context.WIFI_SERVICE);
boolean a = wm.startScan();

关于android - 我应该在 Android 上的每次 WiFi 扫描之间使用什么间隔?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7625071/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com