#android #wifimanager #indoor-positioning-system
#Android #wifimanager #система позиционирования в помещении
Вопрос:
У меня вопрос об использовании WiFiManger в моем приложении. Код довольно прост, я создал эту службу, которая сканирует сеть, чтобы получить доступный Wi-Fi:
@Override
public int onStartCommand(Intent intent, int flags, int startId) {
mapName = intent.getExtras().getString("mapName");
sendNotification();
mainWifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);
// Check for wifi is disabled
if (!mainWifi.isWifiEnabled()) {
// If wifi disabled then enable it
Toast.makeText(getApplicationContext(), "wifi is disabled..making it enabled",
Toast.LENGTH_LONG).show();
mainWifi.setWifiEnabled(true);
}
mainWifi.startScan();
List<ScanResult> scanResults=mainWifi.getScanResults();
readAps=getAps(scanResults);
//List of AP received in current position
String result=compareRP();
if(!result.isEmpty())
Toast.makeText(this, "Localized in RP: " result, Toast.LENGTH_LONG).show();
else
Toast.makeText(this, "Unable to localize you in this map", Toast.LENGTH_LONG).show();
return START_NOT_STICKY;
}
private ArrayList<AccessPoint> getAps(List<ScanResult> scanResults) {
ArrayList<AccessPoint> temp = new ArrayList<AccessPoint>();
for(ScanResult s:scanResults){
temp.add(new AccessPoint(s.SSID,s.level,s.frequency));
}
return temp;
}
Как я могу добавить это условие: я хочу дождаться «свежего» списка Wi-Fi, который появляется, когда:
mainwifi.startScan();
метод возвращает.
Теперь моя служба по-прежнему работает с алгоритмом сопоставления кластеров, и я этого не хочу. Что я должен делать?
Спасибо за любую помощь!
Фред
Комментарии:
1. Зарегистрируйтесь на трансляцию, и у вас будет список wifi. Вы не можете ждать.
2. Я пытался разрешить это с помощью BroadcastReceiver, но это не работает … для сопоставления кластеров мне нужен полный список для сравнения, поэтому я должен подождать, пока метод mainWifi.startScan() вернет мне «true». (Вот пример кода с BroadcastReceiver: pastebin.com/RxV2XFEi )
3. Вы должны реализовать широковещательную передачу, которая будет прослушивать SCAN_RESULTS_AVAILABLE_ACTION. Android запускает его, когда сканирование будет готово. startScan используется для запуска сканирования и возвращает true / false, чтобы сообщить вам, начал ли он поиск или нет. Вы не можете ждать завершения сканирования. Вы должны переместить логику своего приложения в onReceive трансляции.
Ответ №1:
Вы должны использовать a BroadcastReceiver
внутри своей активности.
private final BroadcastReceiver mWifiScanReceiver = new BroadcastReceiver() {
@Override
public void onReceive(Context c, Intent intent) {
// This condition is not necessary if you listen to only one action
if (intent.getAction().equals(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
List<ScanResult> mScanResults = mWifiManager.getScanResults();
Toast.makeText(getApplicationContext(), "Scan results are available", Toast.LENGTH_LONG).show();
// Do what you want
}
}
};
private WifiManager mWifiManager;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
mWifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE);
IntentFilter intentFilter = new IntentFilter();
intentFilter.addAction(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION);
// You can add multiple actions...
registerReceiver(mWifiScanReceiver, intentFilter);
// ...
mWifiManager.startScan();
}