2014-06-23 5 views
0

내 응용 프로그램에 WiFiManger를 사용하는 것에 관한 질문이 있습니다. 것을, 나는 "신선한"와이파이 목록을 기다리고 싶지 :이 조건을 추가 할 수있는 방법startScan이 검사를 마칠 때까지 기다리십시오.

@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; 
} 

: 이 코드는, 나는 가능한 무선 랜을 얻을 수있는 네트워크를 검색하여이 서비스를 매우 간단 만든됩니다 다음 경우에 발생합니다.

mainwifi.startScan(); 

메서드가 반환됩니다.

이제 내 서비스는 여전히 알고리즘과 일치하는 클러스터로 진행되며 원하지 않습니다. 내가 뭘해야 해?

도움 주셔서 감사합니다.

프레드

+0

방송에 등록하면 Wi-Fi 목록이 나타납니다. 기다릴 수 없어. –

+0

BroadcastReceiver로 해결하려고했지만 작동하지 않습니다 ... 클러스터 일치를 위해 전체 목록이 필요하므로 비교를 위해 mainWifi.startScan() 메서드가 돌아올 때까지 기다려야합니다. "참된". (여기서 BroadcastReceiver를 사용한 코드 예제 : http://pastebin.com/RxV2XFEi) – Stiva

+1

SCAN_RESULTS_AVAILABLE_ACTION을 수신 대기하는 브로드 캐스트를 구현해야합니다. 스캔이 준비되면 안드로이드에 의해 트리거됩니다. startScan은 검색을 시작하고 검색을 시작했는지 여부를 알려주는 true/false를 반환하는 데 사용됩니다. 스캔이 완료 될 때까지 기다릴 수 없습니다. 애플리케이션 로직을 onReceive of the Broadcast로 옮겨야합니다. –

답변

0

당신은 당신의 활동 안에 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(); 

}