2014-02-10 5 views
3

В настоящий момент я пытаюсь создать приложение для Android, которое сможет найти устройство с поддержкой Wi-Fi в помещении. Поэтому я разбил его на несколько шагов по порядку, и один из шагов - сканировать доступные беспроводные сети и вернуть уровень сигнала и т. Д., Связанные с каждой точкой доступа, которую он обнаруживает (ему не нужно подключаться к точкам доступа, но просто нужно пинговать их для получения информации). Ниже показан фрагмент кода, который я создал, и когда код отлажен, он не идентифицирует точки доступа Wi-Fi, поэтому кто-то может сказать мне, где проблема, или указать мне в правильном направлении.wifiManager.startScan не возвращает никаких результатов (необходимо руководствоваться)

myWifiMan.startScan(); 
List<ScanResult> wifiList = myWifiMan.getScanResults(); 
if (wifiList != null) { 
    //Construct Clue 
    for(int i = 0; i < wifiList.size(); i++) { 
     message = message + "'" + wifiList.get(i).SSID +"':" + Integer.toString(wifiList.get(i).level); 
     if((i+1) < wifiList.size()) 
     message = message + ","; 
    } 
    message = message + "}]"; 

В связи с ответом, приведенным ниже, приведенный ниже код даст мне желаемые результаты?

private void initializeWiFiListener(){ 

    System.out.println("executing initializeWiFiListener"); 
    String connectivity_context = Context.WIFI_SERVICE; 
    final WifiManager wifi = (WifiManager)getSystemService(connectivity_context); 
    if(!wifi.isWifiEnabled()){ 
     if(wifi.getWifiState() != WifiManager.WIFI_STATE_ENABLING){ 
      wifi.setWifiEnabled(true); 
     } 

    } 
    registerReceiver(new BroadcastReceiver(){ 
     @Override 
     public void onReceive(Context context, Intent intent) {    
      WifiManager wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
      boolean a= wifiManager.startScan();//request a scan for access points 
      final List<ScanResult> results= wifiManager.getScanResults();//list of access points from the last scan 
       for(final ScanResult result : results){ 
       System.out.println("ScanResult level: "+ result.level); 
      }    
     } 
    }, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); 
} 

ответ

4

Это, вероятно, потому, что метод startScan только вызывает открытие соседних точек доступа, и не делает их доступными для вас немедленно.

В Android документации говорится об этом методе, что он:

Запрос сканирования точек доступа. Возвращается немедленно. доступность результатов известна позже с помощью асинхронный событие отправлено по завершении сканирования.

Таким образом, вы должны зарегистрировать BroadcastReceiver к SCAN_RESULTS_AVAILABLE_ACTION для того, чтобы получить список доступных точек доступа, как только завершит сканирование.

В это время вы можете вызвать метод getScanResults(), который вернет список найденных точек доступа.

EDIT: Также убедитесь, что Wi-Fi включен на устройстве перед запуском сканирования.

+0

ok - это пересмотренный код выше правильной идеи? – user3270260

+0

Я бы не объявлял свой «BroadcastReceiver» анонимным классом, так как, возможно, захочу его отменить, когда покончу с этим. Также включение Wi-Fi по-видимому навязчиво и требует дополнительного разрешения. Я бы попросил пользователя включить его явно. –

+0

У меня возникла проблема с транслятором, который получает SCAN_RESULTS_AVAILABLE_ACTION на 2-м устройстве Moto X (2014). В принципе, я могу видеть сканирование в пользовательском интерфейсе системы, но не могу связаться с ними в своем приложении. Я использую необходимые разрешения, и это поведение не происходит в других устройствах (S6, Nexus 5 ...). – leRobot

2

Для getScanResults, официальный Android documentation говорит -

Приложение должно иметь ACCESS_COARSE_LOCATION или разрешение ACCESS_FINE_LOCATION для того, чтобы получить достоверные результаты.

У меня была та же проблема. Без этих разрешений мой код работал на телефонах Samsung, но не в Nexus или Motorola. После включения этих разрешений он дает более подходящие результаты и работает на всех телефонах.

Смежные вопросы