Welchen Abstand soll ich zwischen jedem WiFi scan auf dem Android?
Ich ausführen muss, um WLAN-scans in regelmäßigen Abständen. Ich bin die Begegnung ein problem, wenn das Zeit-Intervall von 1-2 Sekunden. Es scheint, wie ich bin nicht immer alle ScanResult
. Gibt es eine minimale Menge an Zeit, um so einzustellen, dass die WifiManager
ist in der Lage, eine erfolgreiche WiFi-scan?
Hier ist der code. Ich bin mit einem Service
zu tun, die Wifi scan:
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);
}
}
}
}
Aber ich scheine zu bekommen Nullpointer
bei dieser Linie: apdataList.add(ap);
. So Frage ich mich, ob das Intervall ist zu kurz, die Ursachen ScanResult
leer?
- Ich würde nicht schließen, dass Ihre ScanResult-Liste ist leer. Wenn es der Fall war, Sie würde nicht geben Sie Ihre for-Schleife (wifiList.size() wäre 0). Sie sollten überprüfen, warum
ap
oderapdataList
ist null in deinem code. Ich sehe nichtapdataList=new List<APData>();
in Ihrer onCreate(). Könnte gut der Grund sein.
Du musst angemeldet sein, um einen Kommentar abzugeben.
BEARBEITEN, nachdem Sie gepostet code:
apdataList scheint nicht initialisiert werden in onCreate()
hinzufügen onCreate():
Minimale scan-Verzögerung
Ich denke, dass es keine absolute minimum scan-Verzögerung. Es hängt zu viel auf der hardware-Leistungen.
Mein Rat ist, dass Sie ein 'So Schnell Wie Möglich" - option, um Ihre Einstellungen dann verwenden, eine asynchrone Schleife, relaunch einen scan, sobald neue Ergebnisse zu finden sind (siehe das code-snippet unten, es wurde aktualisiert, um Ihre Bedürfnisse anzupassen). Auf diese Weise, es wird nur von der hardware-Leistungen.
Auch Sie können Umfrage die ScanResults mit
WifiManager.getScanResults()
ist Der empfohlene Weg, um zu startenWifiManager.startScan()
und die Einrichtung eines BroadcastReceiver fürWifiManager.SCAN_RESULTS_AVAILABLE_ACTION
um benachrichtigt zu werden, sobald die scan-Ergebnisse sind fertig.Hier ist ein Beispiel-code (ausgeliehen von hier aus und an Ihre Bedürfnisse angepasst):
WifiManager.SCAN_RESULTS_AVAILABLE_ACTION
kann verwendet werden, in SL4A (oder Python für Android) mithilfedroid.eventRegisterForBroadcast("android.net.wifi.SCAN_RESULTS")
und dann miteventWait
odereventPoll
Listener für das Ereignis