热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

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

Androidwifi对象属性及简易Demo本章介绍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 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的名字)
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 list;                   //存放周围wifi热点对象的列表  
  2. list = (ArrayList) 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.


推荐阅读
  • Spring特性实现接口多类的动态调用详解
    本文详细介绍了如何使用Spring特性实现接口多类的动态调用。通过对Spring IoC容器的基础类BeanFactory和ApplicationContext的介绍,以及getBeansOfType方法的应用,解决了在实际工作中遇到的接口及多个实现类的问题。同时,文章还提到了SPI使用的不便之处,并介绍了借助ApplicationContext实现需求的方法。阅读本文,你将了解到Spring特性的实现原理和实际应用方式。 ... [详细]
  • [大整数乘法] java代码实现
    本文介绍了使用java代码实现大整数乘法的过程,同时也涉及到大整数加法和大整数减法的计算方法。通过分治算法来提高计算效率,并对算法的时间复杂度进行了研究。详细代码实现请参考文章链接。 ... [详细]
  • Linux服务器密码过期策略、登录次数限制、私钥登录等配置方法
    本文介绍了在Linux服务器上进行密码过期策略、登录次数限制、私钥登录等配置的方法。通过修改配置文件中的参数,可以设置密码的有效期、最小间隔时间、最小长度,并在密码过期前进行提示。同时还介绍了如何进行公钥登录和修改默认账户用户名的操作。详细步骤和注意事项可参考本文内容。 ... [详细]
  • Iamtryingtomakeaclassthatwillreadatextfileofnamesintoanarray,thenreturnthatarra ... [详细]
  • 在Android开发中,使用Picasso库可以实现对网络图片的等比例缩放。本文介绍了使用Picasso库进行图片缩放的方法,并提供了具体的代码实现。通过获取图片的宽高,计算目标宽度和高度,并创建新图实现等比例缩放。 ... [详细]
  • 向QTextEdit拖放文件的方法及实现步骤
    本文介绍了在使用QTextEdit时如何实现拖放文件的功能,包括相关的方法和实现步骤。通过重写dragEnterEvent和dropEvent函数,并结合QMimeData和QUrl等类,可以轻松实现向QTextEdit拖放文件的功能。详细的代码实现和说明可以参考本文提供的示例代码。 ... [详细]
  • 本文分享了一个关于在C#中使用异步代码的问题,作者在控制台中运行时代码正常工作,但在Windows窗体中却无法正常工作。作者尝试搜索局域网上的主机,但在窗体中计数器没有减少。文章提供了相关的代码和解决思路。 ... [详细]
  • Java序列化对象传给PHP的方法及原理解析
    本文介绍了Java序列化对象传给PHP的方法及原理,包括Java对象传递的方式、序列化的方式、PHP中的序列化用法介绍、Java是否能反序列化PHP的数据、Java序列化的原理以及解决Java序列化中的问题。同时还解释了序列化的概念和作用,以及代码执行序列化所需要的权限。最后指出,序列化会将对象实例的所有字段都进行序列化,使得数据能够被表示为实例的序列化数据,但只有能够解释该格式的代码才能够确定数据的内容。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文介绍了Java高并发程序设计中线程安全的概念与synchronized关键字的使用。通过一个计数器的例子,演示了多线程同时对变量进行累加操作时可能出现的问题。最终值会小于预期的原因是因为两个线程同时对变量进行写入时,其中一个线程的结果会覆盖另一个线程的结果。为了解决这个问题,可以使用synchronized关键字来保证线程安全。 ... [详细]
  • 自动轮播,反转播放的ViewPagerAdapter的使用方法和效果展示
    本文介绍了如何使用自动轮播、反转播放的ViewPagerAdapter,并展示了其效果。该ViewPagerAdapter支持无限循环、触摸暂停、切换缩放等功能。同时提供了使用GIF.gif的示例和github地址。通过LoopFragmentPagerAdapter类的getActualCount、getActualItem和getActualPagerTitle方法可以实现自定义的循环效果和标题展示。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • Spring学习(4):Spring管理对象之间的关联关系
    本文是关于Spring学习的第四篇文章,讲述了Spring框架中管理对象之间的关联关系。文章介绍了MessageService类和MessagePrinter类的实现,并解释了它们之间的关联关系。通过学习本文,读者可以了解Spring框架中对象之间的关联关系的概念和实现方式。 ... [详细]
  • Python爬虫中使用正则表达式的方法和注意事项
    本文介绍了在Python爬虫中使用正则表达式的方法和注意事项。首先解释了爬虫的四个主要步骤,并强调了正则表达式在数据处理中的重要性。然后详细介绍了正则表达式的概念和用法,包括检索、替换和过滤文本的功能。同时提到了re模块是Python内置的用于处理正则表达式的模块,并给出了使用正则表达式时需要注意的特殊字符转义和原始字符串的用法。通过本文的学习,读者可以掌握在Python爬虫中使用正则表达式的技巧和方法。 ... [详细]
  • IOS开发之短信发送与拨打电话的方法详解
    本文详细介绍了在IOS开发中实现短信发送和拨打电话的两种方式,一种是使用系统底层发送,虽然无法自定义短信内容和返回原应用,但是简单方便;另一种是使用第三方框架发送,需要导入MessageUI头文件,并遵守MFMessageComposeViewControllerDelegate协议,可以实现自定义短信内容和返回原应用的功能。 ... [详细]
author-avatar
摩羯参议院1314
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有