天天看點

Android開發周圍wifi熱點和屬性的擷取

Android開發中WiFi熱點和WiFi屬性的擷取會經常被用到,下面就來記錄下WiFi的名稱、狀态等屬性以及擷取周圍WiFi熱點的方法。

一、擷取wifi屬性

要獲得Android系統相關的屬性,通常需要獲得相關的系統服務。在Android中最常用的是通過Manager來獲得對對象的操作服務。WiFi相關的操作中需要用到兩個Manager:WifiManager和ConnectivityManage:

public WifiManager wifiManager;				//管理wifi
public ConnectivityManager connectManager;              //管理網絡連接配接
           
wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);        //獲得系統wifi服務
connectManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);
           

獲得服務後,即可得到對象進而獲得相關屬性:

public NetworkInfo netInfo;					//網絡連接配接
public WifiInfo wifiInfo;					//wifi
public DhcpInfo dhcpInfo;<span style="white-space:pre">					//動态主機配置協定資訊的對象,獲得IP等網關資訊
           

網絡資訊的擷取:

<pre name="code" class="java">netInfo = connectManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
dhcpInfo = wifiManager.getDhcpInfo();
wifiInfo = wifiManager.getConnectionInfo();
           

要獲得wifi相關的網絡資訊,必須設定網絡類型參數:ConnectivityManager.TYPE_WIFI.下面就可以獲得需要的資訊,例如目前連接配接wifi的名稱等等屬性,即SSID:

wifiInfo.getSSID();
           

還要獲得目前連接配接wifi網絡的ip、mask、netgate、dns等資訊,則需要如下實作:

String wifiProperty = "目前連接配接Wifi資訊如下:"+wifiInfo.getSSID()+'\n'+
				"ip:"     +     FormatString(dhcpInfo.ipAddress)   +'\n'+
				"mask:"   +     FormatString(dhcpInfo.netmask)     +'\n'+
				"netgate:"+     FormatString(dhcpInfo.gateway)     +'\n'+
				"dns:"    +     FormatString(dhcpInfo.dns1)  ;
           

其中dhcpInfo屬性的值為int型,要轉換成通常見到的32位位址則需要轉換方法:

public String FormatString(int value){
        String strValue="";
        byte[] ary = intToByteArray(value);
        for(int i=ary.length-1;i>=0;i--){
                strValue += (ary[i] & 0xFF);
                if(i>0){
                        strValue+=".";
                }
        }
        return strValue;
    }
public  byte[] intToByteArray(int value){
        byte[] b = new byte[4];
         for (int i = 0; i < 4; i++){
                int offset = (b.length - 1 - i) * 8;
                 b[i] = (byte) ((value >>> offset) & 0xFF);
          }
          return b;
    }
           

上述方法即可獲得wifi網絡相關的資訊,根據需要來選擇方法。

二、擷取周圍WiFi熱點

wifiManager提供了一個方法getScanResults()來獲得周圍的wifi資訊,其傳回的是一組ScanResult對象,存放在list當中,每個ScanResult對象封裝了一個wifi熱點相關資訊,通過ScanResult對象的屬性即可擷取到,最常用的兩個屬性為wifi名稱(SSID)和信号強度(level):

ArrayList<ScanResult> list;					//存放周圍wifi熱點對象的清單
list = (ArrayList<ScanResult>) wifiManager.getScanResults();
           

通常我們會根據所搜尋到的wifi信号的強度level從強到弱進行排序并顯示在清單上:

//将搜尋到的wifi根據信号強度從強到弱進行排序
private void sortByLevel(ArrayList<ScanResult> list) {
		for(int i=0;i<list.size();i++)
			for(int j=1;j<list.size();j++)
			{
				if(list.get(i).level<list.get(j).level)    //level屬性即為強度
				{
					ScanResult temp = null;
					temp = list.get(i);
					list.set(i, list.get(j));
					list.set(j, temp);
				}
			}
	}
           

ScanResult的信号強度屬性level是負值,因為它是以分貝數來計算的。然後根據你自己的需求建立相應的Adapter将其顯示在ListView上。上述方法搜尋到的wifi很多,你還可以加上動态更新、wifi過濾等功能進行顯示。

如果要對wifi狀态,網絡連接配接狀态進行判斷等操作,不要忘了很重要的一點,就是在AndroidManifest.xml裡添權重限:

<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"></uses-permission>    
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>    
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>    
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
           

繼續閱讀