2015-04-20 54 views
1

我得到了我想掃描網絡的代碼,然後將它全寫到列表視圖中。但問題是ssid和bssid不顯示。一切顯示,但不是ssid。Android WiFi無法從ScanResult獲取SSID和BSSID

另外什麼是每秒更新列表視圖的最佳方式,以便您可以看到信號強度實際信號?

import java.util.List; 

import android.annotation.SuppressLint; 
import android.app.Activity; 
import android.content.BroadcastReceiver; 
import android.content.Context; 
import android.content.Intent; 
import android.content.IntentFilter; 
import android.net.wifi.ScanResult; 
import android.net.wifi.WifiInfo; 
import android.net.wifi.WifiManager; 
import android.os.Bundle; 
import android.widget.ArrayAdapter; 
import android.widget.ListView; 

import com.example.wifi.R; 

public class MainActivity extends Activity { 

    WifiManager wifiManager; 
    WifiScanReceiver wifiReciever; 
    ListView list; 
    String wifis[]; 
    WifiInfo wifiInfo; 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_main); 
     list = (ListView) findViewById(R.id.text); 
     wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
     wifiReciever = new WifiScanReceiver(); 
     wifiInfo = wifiManager.getConnectionInfo(); 
     wifiManager.startScan(); 
    } 



    protected void onPause() { 
     unregisterReceiver(wifiReciever); 
     super.onPause(); 
    } 

    protected void onResume() { 
     registerReceiver(wifiReciever, new IntentFilter(
       WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)); 
     super.onResume(); 
    } 

    class WifiScanReceiver extends BroadcastReceiver { 
     @SuppressLint("UseValueOf") 
     public void onReceive(Context c, Intent intent) { 
      List<ScanResult> wifiScanList = wifiManager.getScanResults(); 
      wifis = new String[wifiScanList.size()]; 
      for (int i = 0; i < wifiScanList.size(); i++) { 
       wifis[i] = ((wifiScanList.get(i)).toString()); 
      } 

      list.setAdapter(new ArrayAdapter<String>(getApplicationContext(), 
        android.R.layout.simple_list_item_1, wifis)); 
     } 
    } 
} 
+0

如果你有networkConfig對象你可以得到它的ssid – KOTIOS

+0

使用'wifiInfo.getSSID();' – Strider

+0

是的,我知道,但是這掃描所有的網絡,所以當我把「wifiInfo.getSSID();」我只獲得1個wifi名稱,而不是所有網絡的名稱。 – Isac

回答

2

你可以使用wifiScanList.get(i).SSIDwifiScanList.get(i).BSSIDScanResult對象的SSIDBSSID。然後將其附加到從toString()返回的其他數據。

請參閱Documentation Here

首先,聲明你的ArrayAdapter爲一個實例變量,並調用setAdapter()onCreate():每個掃描結果

class WifiScanReceiver extends BroadcastReceiver { 
     @SuppressLint("UseValueOf") 
     public void onReceive(Context c, Intent intent) { 
      List<ScanResult> wifiScanList = wifiManager.getScanResults(); 
      //wifis = new String[wifiScanList.size()]; //remove this 
      wifis.clear(); //add this 
      for (int i = 0; i < wifiScanList.size(); i++) { 
       String ssid = wifiScanList.get(i).SSID; //Get the SSID 
       String bssid = wifiScanList.get(i).BSSID //Get the BSSID 
       //use add here: 
       wifis.add(ssid + " " + bssid + " " +((wifiScanList.get(i)).toString())); //append to the other data 
      } 

      adapter.notifyDataSetChanged(); //add this 
      wifiManager.startScan(); //start a new scan to update values faster 

      //ArrayAdapter adapter = new ArrayAdapter<String>(getApplicationContext(), 
      //  android.R.layout.simple_list_item_1, wifis) 
      //list.setAdapter(adapter); 
     } 
    } 

這將仍然只有更新:

ArrayAdapter adapter; 
ListView list; 
ArrayList<String> wifis; 
WifiInfo wifiInfo; 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.activity_main); 
    list = (ListView) findViewById(R.id.text); 
    wifiManager = (WifiManager) getSystemService(Context.WIFI_SERVICE); 
    wifiReciever = new WifiScanReceiver(); 
    wifiInfo = wifiManager.getConnectionInfo(); 

    wifis = new ArrayList<String>(); //initialize wifis 
    wifis.add("loading..."); 
    adapter = new ArrayAdapter<String>(getApplicationContext(), 
         android.R.layout.simple_list_item_1, wifis) 
    list.setAdapter(adapter); 

    wifiManager.startScan(); //make sure this is the last call 
} 

修改BroadcastReceiver。我不認爲建議每秒更新一次ListView,但您可能需要重新考慮顯示RSSI級別的方法。您可以爲每個SSID進行一次點擊操作,並在詳細信息視圖中顯示TextView,您可以在其中每秒更新當前SSID的RSSI。

+0

謝謝,這工作:)什麼是最好的方式來更新列表視圖的實際值? – Isac

+0

我收到此消息「E/AndroidRuntime:致命異常:main java.lang.RuntimeException:無法啓動活動」。從行「adapter = new ArrayAdapter (getApplicationContext(), android.R.layout.simple_list_item_1,wifis);」 – Isac

+0

我編輯了我的代碼,我得到了兩個聲明爲實例變量和setcontentview:S – Isac

相關問題