Android wifi属性简介 及 wifi信息获取(wifi列表、配置信息、热点信息)

来源:互联网 发布:js获取当前页面url参数 编辑:程序博客网 时间:2024/05/16 11:47
Android wifi对象属性及简易Demo

本章介绍Android开发中WiFi热点和WiFi属性的获取,介绍WiFi的名称、状态等属性以及获取周围WiFi热点的方法。

一、怎样获取wifi对象并进行操作

要操作 WIFI 设备,需要先获取 Context.getSystemService(Context.WIFI_SERVICE)获取WifiManager对象,并通过这个对象来管理WIFI设备。
addNetwork(WifiConfiguration config) 添加一个config描述的WIFI网络,默认情况下,这个WIFI网络是DISABLE状态的。calculateSignalLevel(int rssi , int numLevels) 计算信号的等级compareSignalLevel(int rssiA, int rssiB) 对比网络A和网络B的信号强度createWifiLock(int lockType, String tag) 创建一个WIFI 锁,锁定当前的WIFI连接disableNetwork(int netId) 让一个网络连接失效disconnect() 断开当前的WIFI连接enableNetwork(int netId, Boolean disableOthers) 连接netId所指的WIFI网络,并是其他的网络都被禁用getConfiguredNetworks() 获取网络连接的状态getConnectionInfo() 获取当前连接的信息getDhcpInfo() 获取DHCP 的信息getScanResulats() 获取扫描测试的结果getWifiState() 获取当前WIFI设备的状态isWifiEnabled() 判断WIFI设备是否打开pingSupplicant() ping操作,和PC的ping操作相同作用ressociate() 重新连接WIFI网络,即使该网络是已经被连接上的reconnect() 重新连接一个未连接上的WIFI网络removeNetwork() 移除某一个网络saveConfiguration() 保留一个配置信息setWifiEnabled() 让一个连接有效startScan() 开始扫描updateNetwork(WifiConfiguration config) 更新一个网络连接

二、常用的wifi状态

WIFI_STATE_DISABLED //WIFI网卡不可用 WIFI_STATE_DISABLING //WIFI网卡正在关闭 WIFI_STATE_ENABLED //WIFI网卡可用 WIFI_STATE_ENABLING //WIFI网卡正在打开 WIFI_STATE_UNKNOWN //WIFI网卡状态不可知

三、列表查看有连接信号的wifi热点

ScanResult 对象就是用来表示附近 wifi 热点的属性的,可通过 WifiManager.getScanResults() 返回一个ScanResult列表,
ScanResult 的重要属性如下:

1. BSSID接入点的地址
2. SSID网络的名字,唯一区别WIFI网络的名字
3. Capabilities网络接入的性能
4. Frequency当前WIFI设备附近热点的频率(MHz)
5. Level所发现的WIFI网络信号强度

四、连接wifi热点

通过 WifiManager.getConfiguredNetworks() 方法会返回WifiConfiguration对象的列表,然后再调用WifiManager.enableNetwork();方法就可以连接上指定的热点。

五、查看已经连接上的wifi信息

WifiInfo 是专门用来表示连接的对象,这个对象可以通过WifiManager.getConnectionInfo()来获取。
WifiInfo中包含了当前连接中的相关信息。
getBSSID() 获取BSSID属性getDetailedStateOf() 获取客户端的连通性getHiddenSSID() 获取SSID 是否被隐藏getIpAddress() 获取IP 地址getLinkSpeed() 获取连接的速度getMacAddress() 获取Mac 地址getRssi() 获取802.11n 网络的信号getSSID() 获取SSIDgetSupplicanState() 获取具体客户端状态的信息

六、示例

1)获得WifiManager
WifiManager wifiManager=(WifiManager) getSystemService(WIFI_SERVICE);

2)获取Wifi信息
 WifiInfo wifiInfo=wifiManager.getConnectionInfo();//当前wifi连接信息 List<ScanResult> scanResults=wifiManager.getScanResults();//搜索到的设备列表    for (ScanResult scanResult : scanResults) {            tv.append("\n设备名:"+scanResult.SSID                       +" 信号强度:"+scanResult.level+"/n :"+wifiManager.calculateSignalLevel(scanResult.level,4));        }

附 WifiManager中计算级别的代码:
/**     * Calculates the level of the signal. This should be used any time a signal     * is being shown.     * @param rssi The power of the signal measured in RSSI.     * @param numLevels The number of levels to consider in the calculated     *            level.     * @return A level of the signal, given in the range of 0 to numLevels-1     *         (both inclusive).     */    public static int calculateSignalLevel(int rssi, int numLevels) {        if (rssi <= MIN_RSSI) {            return 0;        } else if (rssi >= MAX_RSSI) {            return numLevels - 1;        } else {            int partitionSize = (MAX_RSSI - MIN_RSSI) / (numLevels - 1);            return (rssi - MIN_RSSI) / partitionSize;        }    }

3)网络权限
<!-- 以下是使用wifi访问网络所需的权限 -->    <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"/>    <uses-permission android:name="android.permission.CHANGE_WIFI_STATE" />    <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />    <uses-permission android:name="android.permission.ACCESS_WIFI_STATE" />

如:方法封装(返回返回当前连接的wifi的名字)
private String getConnectWifiSsid(){WifiManager wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);WifiInfo wifiInfo = wifiManager.getConnectionInfo();Log.d("wifiInfo", wifiInfo.toString());Log.d("SSID",wifiInfo.getSSID());return wifiInfo.getSSID();}
如果不是想获取当前连接,而是想获取WIFI设置中的连接,可以使用 WifiManager.getConfiguredNetworks

七、获取当前已连接的wifi配置信息

public class MyWifi extends Activity      {          @Override          public void onCreate(Bundle savedInstanceState)          {              super.onCreate(savedInstanceState);              setContentView(R.layout.main);              TextView infoText = (TextView) this.findViewById(R.id.info);              infoText.setText(getInfo());          }          private String getInfo()          {              WifiManager wifi = (WifiManager) getSystemService(Context.WIFI_SERVICE);              WifiInfo info = wifi.getConnectionInfo();              String maxText = info.getMacAddress();              String ipText = intToIp(info.getIpAddress());              String status = "";              if (wifi.getWifiState() == WifiManager.WIFI_STATE_ENABLED)              {                  status = "WIFI_STATE_ENABLED";              }              String ssid = info.getSSID();              int networkID = info.getNetworkId();              int speed = info.getLinkSpeed();              return "mac:" + maxText + "\n\r"              + "ip:" + ipText + "\n\r"              + "wifi status :" + status + "\n\r"              + "ssid :" + ssid + "\n\r"              + "net work id :" + networkID + "\n\r"              + "connection speed:" + speed + "\n\r"              ;          }          private String intToIp(int ip)          {              return (ip & 0xFF) + "." + ((ip >> 8) & 0xFF) + "." + ((ip >> 16) & 0xFF) + "."                      + ((ip >> 24) & 0xFF);          }      }  

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

一、获取wifi属性

获得Android系统相关的属性,通过Manager来获得对对象的操作服务。WiFi相关的操作中需要用到两个Manager:WifiManager和ConnectivityManage:

[java] view plaincopy
  1. public WifiManager wifiManager;             //管理wifi  
  2. public ConnectivityManager connectManager; //管理网络连接  
[java] view plaincopy
  1. wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);        //获得系统wifi服务  
  2. connectManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);  

获得服务后,即可得到对象进而获得相关属性:

[java] view plaincopy
  1. public NetworkInfo netInfo;                 //网络连接  
  2. public WifiInfo wifiInfo;                   //wifi  
  3. public DhcpInfo dhcpInfo;                   //动态主机配置协议信息的对象,获得IP等网关信息  
网络信息的获取:

[java] view plaincopy
  1. netInfo = connectManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);  
  2. dhcpInfo = wifiManager.getDhcpInfo();  
  3. wifiInfo = wifiManager.getConnectionInfo();  

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

[java] view plaincopy
  1. wifiInfo.getSSID();  
还要获得当前连接wifi网络的 ip、mask、netgate、dns 等信息,则需要如下实现:

[java] view plaincopy
  1. String wifiProperty = "当前连接Wifi信息如下:"+wifiInfo.getSSID()+'\n'+  
  2.                 "ip:"     +     FormatString(dhcpInfo.ipAddress)   +'\n'+  
  3.                 "mask:"   +     FormatString(dhcpInfo.netmask)     +'\n'+  
  4.                 "netgate:"+     FormatString(dhcpInfo.gateway)     +'\n'+  
  5.                 "dns:"    +     FormatString(dhcpInfo.dns1)  ;  
其中dhcpInfo属性的值为int型,要转换成通常见到的32位地址则需要转换方法:

[java] view plaincopy
  1. public String FormatString(int value){  
  2.         String strValue="";  
  3.         byte[] ary = intToByteArray(value);  
  4.         for(int i=ary.length-1;i>=0;i--){  
  5.                 strValue += (ary[i] & 0xFF);  
  6.                 if(i>0){  
  7.                         strValue+=".";  
  8.                 }  
  9.         }  
  10.         return strValue;  
  11.     }  
  12. public  byte[] intToByteArray(int value){  
  13.         byte[] b = new byte[4];  
  14.          for (int i = 0; i < 4; i++){  
  15.                 int offset = (b.length - 1 - i) * 8;  
  16.                  b[i] = (byte) ((value >>> offset) & 0xFF);  
  17.           }  
  18.           return b;  
  19.     }  
上述方法即可获得wifi网络相关的信息,根据需要来选择方法。

二、获取周围WiFi热点

wifiManager提供了一个方法getScanResults()来获得周围的wifi信息,其返回的是一组ScanResult对象,存放在list当中,每个ScanResult对象封装了一个wifi热点相关信息,通过ScanResult对象的属性即可获取到,最常用的两个属性为wifi名称(SSID)和信号强度(level):

[java] view plaincopy
  1. ArrayList<ScanResult> list;                   //存放周围wifi热点对象的列表  
  2. list = (ArrayList<ScanResult>) wifiManager.getScanResults();  
通常我们会根据所搜索到的wifi信号的强度level从强到弱进行排序并显示在列表上:

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


获取Wifi列表简单示例:http://download.csdn.net/download/gao_chun/8724413

create by gao_chun.
6 1
原创粉丝点击