Android开发周围wifi热点和属性的获取

时间:2025-01-27 15:09:31

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 = (ConnectivityManager.TYPE_WIFI);
dhcpInfo = ();
wifiInfo = ();

 

要获得wifi相关的网络信息,必须设定网络类型参数:ConnectivityManager.TYPE_WIFI.下面就可以获得需要的信息,例如当前连接wifi的名称等等属性,即SSID:

();
还要获得当前连接wifi网络的ip、mask、netgate、dns等信息,则需要如下实现:

String wifiProperty = "当前连接Wifi信息如下:"+()+'\n'+
				"ip:"     +     FormatString()   +'\n'+
				"mask:"   +     FormatString()     +'\n'+
				"netgate:"+     FormatString()     +'\n'+
				"dns:"    +     FormatString(dhcpInfo.dns1)  ;
其中dhcpInfo属性的值为int型,要转换成通常见到的32位地址则需要转换方法:

public String FormatString(int value){
        String strValue="";
        byte[] ary = intToByteArray(value);
        for(int i=-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 = ( - 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>) ();
通常我们会根据所搜索到的wifi信号的强度level从强到弱进行排序并显示在列表上:

//将搜索到的wifi根据信号强度从强到弱进行排序
private void sortByLevel(ArrayList<ScanResult> list) {
		for(int i=0;i<();i++)
			for(int j=1;j<();j++)
			{
				if((i).level<(j).level)    //level属性即为强度
				{
					ScanResult temp = null;
					temp = (i);
					(i, (j));
					(j, temp);
				}
			}
	}
ScanResult的信号强度属性level是负值,因为它是以分贝数来计算的。然后根据你自己的需求创建相应的Adapter将其显示在ListView上。上述方法搜索到的wifi很多,你还可以加上动态更新、wifi过滤等功能进行显示。

如果要对wifi状态,网络连接状态进行判断等操作,不要忘了很重要的一点,就是在里添加权限:

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