2016-05-26 2 views
0

私は周囲のアクセスポイントをスキャンする必要があるアプリケーションを作成しており、結果に応じていくつかの計算が行われます。ここまでで、新しいスキャンを開始するにもかかわらず、WifiManager.statScan()メソッドが、新しいスキャンの結果を自動的に返さないと確信しています。ボタンを押すたびに、Androidの携帯電話で新しいスキャン結果を受け取る方法はありますか?

これは私のコードです:

public void onClick(View v) { 
    switch (v.getId()){ 
     case R.id.button: 
      //do some reseting for the GUI and the values of the problem. 
      break; 
     case R.id.button2: 
      wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
      wifiManager.startScan(); 
      List<ScanResult> scanResult = null; 
      if(wifiManager.startScan()){ 
       scanResult = wifiManager.getScanResults(); 
      } 
      // Do the calculations. 
      break; 

    } 
} 

私の問題は、このコードを使用した場合、私は私が実際に開始したスキャンの結果や結果は、前回のスキャンから取得し確認していないということであり、後者は、ある場合には正しい、新しいスキャンの結果を得るにはどうすればいいですか?

ありがとうございました。

次のように様々な投稿やtutoriasを検索して読んだ後、私のコードは、変換されています:

public class MainActivity extends AppCompatActivity implements View.OnClickListener{ 
BroadcastReceiver receiver; 
private List<ScanResult> scanResult; 
boolean waiting; 
// and other irrelevant variables. 

@Override 
protected void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    //initialization of the elements of the GUI 
    reset.setOnClickListener(this); 
    locate.setOnClickListener(this); 
    wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
    waiting = true; 
    receiver = new WifiScaner(this); 
    registerReceiver(receiver, new IntentFilter(WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); 

} 

@Override 
public void onClick(View v) { 
    switch (v.getId()){ 
     case R.id.button: 
      // resetting the variables of the application 
      break; 
     case R.id.button2: 
      wifiManager.startScan(); 
      while (waiting) { 
       try { 
        Thread.sleep(200); 
       } catch (InterruptedException e) { 
        // TODO Auto-generated catch block 
        e.printStackTrace(); 
       } 
       Log.d("PROJECT1","Wifi WAITING"); 
      } 
      //Calculations 
      break; 

    } 
} 

public class WifiScaner extends BroadcastReceiver{ 
    MainActivity main; 
    public WifiScaner(MainActivity main){ 
     super(); 
     this.main = main; 
    } 
    public void onReceive(Context c, Intent intent) { 
     scanResult = main.wifiManager.getScanResults(); 
     waiting = false; 
     Log.d("PROJECT1","Wifi RECEIVED"); 
    } 
} 

} しかし、私がWifiScanerのonReceiveに入ることはないと思われるいくつかの理由のために。なぜこれが起こっているのか?

答えて

1

あなたが正しいです、スキャンには時間がかかりますので、すぐに結果を得ることはできません。これは、startScan()メソッドのドキュメントで確認されています。

"アクセスポイントのスキャンを要求します。結果の可用性は、後でスキャンの完了時に送信される非同期イベントによって知られています。

次のリンクは、スキャンが完了したときの通知方法の良い例です:http://www.tutorialspoint.com/android/android_wi_fi.htm

+0

はい私はチュートリアルからアイディアを得ましたが、スキャン結果を受け取るためにどのように待つことができますか?アプリケーションを実行すると、リストにはまだ何も入っていないので、クラッシュします。 – user2149122

+0

リスナーが起動するまでリストを処理しないでください。 –

関連する問題