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

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() 获取SSID
getSupplicanState() 获取具体客户端状态的信息

六、示例

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
plain
copy

  1. public WifiManager wifiManager;             //管理wifi
  2. public ConnectivityManager connectManager; //管理网络连接

[java] view
plain
copy

  1. wifiManager = (WifiManager) getSystemService(WIFI_SERVICE);        //获得系统wifi服务
  2. connectManager = (ConnectivityManager) getSystemService(CONNECTIVITY_SERVICE);

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

[java] view
plain
copy

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

网络信息的获取:

[java] view
plain
copy

  1. netInfo = connectManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
  2. dhcpInfo = wifiManager.getDhcpInfo();
  3. wifiInfo = wifiManager.getConnectionInfo();

要获得wifi相关的网络信息,必须设定网络类型参数:ConnectivityManager.TYPE_WIFI.

下面就可以获得需要的信息,例如当前连接wifi的名称等等属性,即SSID:

[java] view
plain
copy

  1. wifiInfo.getSSID();

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

[java] view
plain
copy

  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
plain
copy

  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
plain
copy

  1. ArrayList<ScanResult> list;                   //存放周围wifi热点对象的列表
  2. list = (ArrayList<ScanResult>) wifiManager.getScanResults();

通常我们会根据所搜索到的wifi信号的强度level从强到弱进行排序并显示在列表上:

[html] view
plain
copy

  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.

时间: 2024-10-12 04:01:00

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

Android ListView 和 Adapter 从本地/网络获取歌曲列表

本文内容 环境 项目结构 演示1:SimpleAdapter 演示2:BaseAdapter 演示3:customlazylist 演示4:customcompletelazylist 本文只给出演示概要,代码太多,贴出来意义不大,自己下载调试一下,点击此处下载. 本文通过四个示例,循序渐进地演示,将歌曲列表加载到 ListView 控件,歌曲列表,包括缩略图.歌手名.歌曲名等信息,或存放在本地,或以 JSON 形式存放在网络. 环境 Windows 2008 R2 64 位 Eclipse A

Android系统属性简介

查看Android源码你会发现,代码中大量存在:SystemProperties.set()/SystemProperties.get():通过这两个接口可以对系统的属性进行读取/设置,顾名思义系统属性,肯定对整个系统全局共享. 属性系统是android的一个重要特性.它作为一个服务运行,管理系统配置和状态.所有这些配置和状态都是属性.每个属性是一个键值对(key/value pair),其类型都是字符串.这些属性可能是有些资源的使用状态,进程的执行状态,系统的特有属性--  可以通过命令adb

Android疑惑篇------------含有button按钮的ListView中,列表项无法获取焦点的问题

问题描述: 有过在ListView的列表项中添加按钮的朋友对这个问题一定不会陌生,我们的Demo在运行时,会出现这样的情况----------可以获取到列表项中的按钮点击事件,但是当我们想要获取整个列表项的点击事件时,就会发现此时点击列表项是没有任何反应的.为什么呢? 原因就是当在ListView中加入Button这类的有 “点击” 事件的widget时,ListView的itemclick事件将会被其它widget的click事件屏蔽,从而无法触发. 我们先来看一下列表项的XML文件 <?xm

android WIFI信息获取

在androi中WIFI信息的获取可以通过系统提供的WIFI Service获取 [java] WifiManager wifi_service = (WifiManager)getSystemService(WIFI_SERVICE); WifiInfo    wifiInfo     = wifi_service.getConnectionInfo(); 其中WifiInfo 中比较常用的信息有: [java] /* info.getBSSID():      获取BSSID地址. info

Android中可以做的两件坏事---破解锁屏密码和获取Wifi密码

之前的文章一直在介绍OC,最近也是在找急忙慌的学习IOS,所以Android方面的知识分享就有点中断了,但是我现在还是要靠Android吃饭,所以不能Android的工作不能停呀,今天咋们来看一下我在现实中遇到的两个问题和解决方案 问题一:忘记手机的锁屏密码了 Android中在设置中的安全菜单栏中是可以设置锁屏密码的,有直接的文本密码和手势密码(我们一般会用到的两个密码),但是有时候脑子不好使,密码总是忘了,到时候该怎么办呢? 方法一:我们知道现在最流行的手势锁就是九宫格了,他在设置手势的时候

Android中可以做的两件坏事——破解锁屏密码和获取Wifi密码

今天咋们来看一下我在现实中遇到的两个问题和解决方案 问题一:忘记手机的锁屏密码了 Android中在设置中的安全菜单栏中是可以设置锁屏密码的,有直接的文本密码和手势密码(我们一般会用到的两个密码),但是有时候脑子不好使,密码总是忘了,到时候该怎么办呢? 方法一:我们知道现在最流行的手势锁就是九宫格了,他在设置手势的时候,是有一定规则的,比如手势点不能少于4个,而且有些手势是不存在的,一般手势是九宫格,每个点代表一个数值: 0     1     2 3     4     5 6     7  

Android 6.0以上获取Wifi列表问题

在已经打开 Wifi 的情况下获取 Wifi 时,wifiManager.getScanResults() 方法始终返回的是null.因为当时是在网上查询资料敲的代码,多找了几份资料后,看到代码都是一样的,反复确认自己有没有遗漏或者写错.甚至怀疑人生!索性克服心理恐惧点开源码,结果却找到了答案: 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 /** * Return the results of the latest access point scan. *

获取wifi信息

最近有个项目需要获取手机附近wifi列表,查了许多资料发现,现在只能查到wifi的SSID,并且用到的是私有api,无法通过app store审核,这里记录一下,方便学习,新手勿喷,欢迎大神指教(wifi信息获取需要真机测试才能获取数据) 导入系统头文件 #import <SystemConfiguration/CaptiveNetwork.h> 实现代码 NSString *ssid = @"Not Found"; NSString *macIp = @"Not

Android WiFi 通信 -- WiFi 和 Wifi Direct 简介

WiFi简介 Wi-Fi可分为五代:第一代802.11,1997年制定,只运行于2.4GHz,最快2Mbit/s 第二代802.11b,只运行于2.4GHz,最快11Mbit/s,正逐渐淘汰 第三代802.11g/a,分别运行于2.4GHz和5GHz,最快54Mbit/s 第四代802.11n,可运行于2.4GHz或5GHz,20和40MHz带宽下最快72和150Mbit/s 第五代802.11ac,只运行于5GHz 由于ISM频段中的2.4GHz频段被广泛使用,例如微波炉.蓝牙,它们会干扰Wi