【移动开发】Android中WIFI开发总结(一)
 WIFI就是一种无线联网技术,常见的是使用无线路由器。那么在这个无线路由器的信号覆盖的范围内都可以采用WIFI连接的方式进行联网。如果无线路由器连接了一个ADSL线路或其他的联网线路,则又被称为“热点”。
在Android中对Wifi操作,android本身提供了一些有用的包,在android.net.wifi包下面,主要包括以下几个类和接口:
1.ScanResult
主要用来描述已经检测出的接入点,包括接入点的地址,接入点的名称,身份认证,频率,信号强度等信息。其实就是通过wifi 硬件的扫描来获取一些周边的wifi 热点的信息。
2.WifiConfiguration
Wifi网络的配置,包括安全设置等,在我们连通一个wifi 接入点的时候,需要获取到的一些信息。主要包含四个属性:
BSSID:
BSS是一种特殊的Ad-hoc LAN(一种支持点对点访问的无线网络应用模式)的应用,一个无线网络至少由一个连接到有线网络的AP和若干无线工作站组成,这种配置称为一个基本服务装置。一群计算机设定相同的 BSS名称,即可自成一个group,而此BSS名称,即所谓BSSID。通常,手机WLAN中,bssid其实就是无线路由的MAC地址。
3.WifiInfo
wifi无线连接的描述,包括(接入点,网络连接状态,隐藏的接入点,IP地址,连接速度,MAC地址,网络ID,信号强度等信息)。这里简单介绍一下WifiManager中常用的方法:
| getSSID() | 获得SSID(热点名称) | 
| getBSSID() | 获取BSSID | 
| getDetailedStateOf() | 获取客户端的连通性 | 
| getHiddenSSID() | 获得SSID 是否被隐藏 | 
| getIpAddress() | 获取IP 地址 | 
| getLinkSpeed() | 获得连接的速度 | 
| getMacAddress() | 获得Mac 地址 | 
| getRssi() | 获得802.11n 网络的信号 | 
4.WifiManager
wifi连接统一管理类,获取WIFI网卡的状态(WIFI网卡的状态是由一系列的整形常量来表示的)
| WIFI_STATE_DISABLING = 0 | WIFI网卡正在关闭 | 
| WIFI_STATE_DISABLED = 1 | WIFI网卡不可用 | 
| WIFI_STATE_ENABLING = 2 | WIFI网正在打开 (WIFI启动需要一段时间) | 
| WIFI_STATE_ENABLED = 3 | WIFI网卡可用 | 
| WIFI_STATE_UNKNOWN = 4 | 未知网卡状态 | 
| WIFI_AP_STATE_DISABLING = 10 | WIFI热点正在关闭 | 
| WIFI_AP_STATE_DISABLED = 11 | WIFI热点不可用 | 
| WIFI_AP_STATE_ENABLING = 12 | WIFI热点正在打开 | 
| WIFI_AP_STATE_ENABLED = 13 | WIFI热点可用 | 
5. 在AndroidManifest.xml进行对WIFI操作的权限设置
| 1 2 3 4 5 | <!-- 以下是使用wifi访问网络所需的权限 -->    <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> | 
下面是汇总的一个wifi管理工具类,我完善了一下,并加上了详细的注解,很实用的!
WifiAdmin类: (wifi管理工具类)
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 | packagecom.zhf.wifidemo.wifi.utils;importjava.lang.reflect.Field;importjava.lang.reflect.Method;importjava.util.Iterator;importjava.util.List;importandroid.content.Context;importandroid.net.wifi.ScanResult;importandroid.net.wifi.WifiConfiguration;importandroid.net.wifi.WifiInfo;importandroid.net.wifi.WifiManager;/** * WIFI管理类 * @author ZHF * */publicclassWifiAdmin {    privatestaticWifiAdmin wifiAdmin = null;                                                                                                                                                              privateList<WifiConfiguration> mWifiConfiguration; //无线网络配置信息类集合(网络连接列表)    privateList<ScanResult> mWifiList; //检测到接入点信息类 集合                                                                                                                                                              //描述任何Wifi连接状态    privateWifiInfo mWifiInfo;                                                                                                                                                              WifiManager.WifiLock mWifilock; //能够阻止wifi进入睡眠状态,使wifi一直处于活跃状态    publicWifiManager mWifiManager;                                                                                                                                                              /**     * 获取该类的实例(懒汉)     * @param context     * @return     */    publicstaticWifiAdmin getInstance(Context context) {        if(wifiAdmin == null) {            wifiAdmin = newWifiAdmin(context);            returnwifiAdmin;        }        returnnull;    }    privateWifiAdmin(Context context) {        //获取系统Wifi服务   WIFI_SERVICE        this.mWifiManager = (WifiManager) context.getSystemService("wifi");        //获取连接信息        this.mWifiInfo = this.mWifiManager.getConnectionInfo();    }                                                                                                                                                              /**     * 是否存在网络信息     * @param str  热点名称     * @return     */    privateWifiConfiguration isExsits(String str) {        Iterator localIterator = this.mWifiManager.getConfiguredNetworks().iterator();        WifiConfiguration localWifiConfiguration;        do{            if(!localIterator.hasNext()) returnnull;            localWifiConfiguration = (WifiConfiguration) localIterator.next();        }while(!localWifiConfiguration.SSID.equals("\""+ str + "\""));        returnlocalWifiConfiguration;    }                                                                                                                                                              /**锁定WifiLock,当下载大文件时需要锁定 **/    publicvoidAcquireWifiLock() {        this.mWifilock.acquire();    }    /**创建一个WifiLock**/    publicvoidCreateWifiLock() {        this.mWifilock = this.mWifiManager.createWifiLock("Test");    }    /**解锁WifiLock**/    publicvoidReleaseWifilock() {        if(mWifilock.isHeld()) { //判断时候锁定            mWifilock.acquire();        }    }                                                                                                                                                                                                                                                                                                                        /**打开Wifi**/    publicvoidOpenWifi() {        if(!this.mWifiManager.isWifiEnabled()){ //当前wifi不可用            this.mWifiManager.setWifiEnabled(true);        }    }    /**关闭Wifi**/    publicvoidcloseWifi() {        if(mWifiManager.isWifiEnabled()) {            mWifiManager.setWifiEnabled(false);        }    }    /**端口指定id的wifi**/    publicvoiddisconnectWifi(intparamInt) {        this.mWifiManager.disableNetwork(paramInt);    }                                                                                                                                                              /**添加指定网络**/    publicvoidaddNetwork(WifiConfiguration paramWifiConfiguration) {        inti = mWifiManager.addNetwork(paramWifiConfiguration);        mWifiManager.enableNetwork(i, true);    }                                                                                                                                                              /**     * 连接指定配置好的网络     * @param index 配置好网络的ID     */    publicvoidconnectConfiguration(intindex) {        // 索引大于配置好的网络索引返回         if(index > mWifiConfiguration.size()) {            return;        }        //连接配置好的指定ID的网络         mWifiManager.enableNetwork(mWifiConfiguration.get(index).networkId, true);    }                                                                                                                                                              /**     * 根据wifi信息创建或关闭一个热点     * @param paramWifiConfiguration     * @param paramBoolean 关闭标志     */    publicvoidcreateWifiAP(WifiConfiguration paramWifiConfiguration,booleanparamBoolean) {        try{            Class localClass = this.mWifiManager.getClass();            Class[] arrayOfClass = newClass[2];            arrayOfClass[0] = WifiConfiguration.class;            arrayOfClass[1] = Boolean.TYPE;            Method localMethod = localClass.getMethod("setWifiApEnabled",arrayOfClass);            WifiManager localWifiManager = this.mWifiManager;            Object[] arrayOfObject = newObject[2];            arrayOfObject[0] = paramWifiConfiguration;            arrayOfObject[1] = Boolean.valueOf(paramBoolean);            localMethod.invoke(localWifiManager, arrayOfObject);            return;        } catch(Exception e) {            e.printStackTrace();        }    }    /**     * 创建一个wifi信息     * @param ssid 名称     * @param passawrd 密码     * @param paramInt 有3个参数,1是无密码,2是简单密码,3是wap加密     * @param type 是"ap"还是"wifi"     * @return     */    publicWifiConfiguration createWifiInfo(String ssid, String passawrd,intparamInt, String type) {        //配置网络信息类        WifiConfiguration localWifiConfiguration1 = newWifiConfiguration();        //设置配置网络属性        localWifiConfiguration1.allowedAuthAlgorithms.clear();        localWifiConfiguration1.allowedGroupCiphers.clear();        localWifiConfiguration1.allowedKeyManagement.clear();        localWifiConfiguration1.allowedPairwiseCiphers.clear();        localWifiConfiguration1.allowedProtocols.clear();                                                                                                                                                                      if(type.equals("wt")) { //wifi连接            localWifiConfiguration1.SSID = ("\""+ ssid + "\"");            WifiConfiguration localWifiConfiguration2 = isExsits(ssid);            if(localWifiConfiguration2 != null) {                mWifiManager.removeNetwork(localWifiConfiguration2.networkId); //从列表中删除指定的网络配置网络            }            if(paramInt == 1) { //没有密码                localWifiConfiguration1.wepKeys[0] = "";                localWifiConfiguration1.allowedKeyManagement.set(0);                localWifiConfiguration1.wepTxKeyIndex = 0;            } elseif(paramInt == 2) { //简单密码                localWifiConfiguration1.hiddenSSID = true;                localWifiConfiguration1.wepKeys[0] = ("\""+ passawrd + "\"");            } else{ //wap加密                localWifiConfiguration1.preSharedKey = ("\""+ passawrd + "\"");                localWifiConfiguration1.hiddenSSID = true;                localWifiConfiguration1.allowedAuthAlgorithms.set(0);                localWifiConfiguration1.allowedGroupCiphers.set(2);                localWifiConfiguration1.allowedKeyManagement.set(1);                localWifiConfiguration1.allowedPairwiseCiphers.set(1);                localWifiConfiguration1.allowedGroupCiphers.set(3);                localWifiConfiguration1.allowedPairwiseCiphers.set(2);            }        }else{//"ap" wifi热点            localWifiConfiguration1.SSID = ssid;            localWifiConfiguration1.allowedAuthAlgorithms.set(1);            localWifiConfiguration1.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);            localWifiConfiguration1.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);            localWifiConfiguration1.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);            localWifiConfiguration1.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);            localWifiConfiguration1.allowedKeyManagement.set(0);            localWifiConfiguration1.wepTxKeyIndex = 0;            if(paramInt == 1) {  //没有密码                localWifiConfiguration1.wepKeys[0] = "";                localWifiConfiguration1.allowedKeyManagement.set(0);                localWifiConfiguration1.wepTxKeyIndex = 0;            } elseif(paramInt == 2) { //简单密码                localWifiConfiguration1.hiddenSSID = true;//网络上不广播ssid                localWifiConfiguration1.wepKeys[0] = passawrd;            } elseif(paramInt == 3) {//wap加密                localWifiConfiguration1.preSharedKey = passawrd;                localWifiConfiguration1.allowedAuthAlgorithms.set(0);                localWifiConfiguration1.allowedProtocols.set(1);                localWifiConfiguration1.allowedProtocols.set(0);                localWifiConfiguration1.allowedKeyManagement.set(1);                localWifiConfiguration1.allowedPairwiseCiphers.set(2);                localWifiConfiguration1.allowedPairwiseCiphers.set(1);            }        }        returnlocalWifiConfiguration1;    }                                                                                                                                                              /**获取热点名**/    publicString getApSSID() {        try{            Method localMethod = this.mWifiManager.getClass().getDeclaredMethod("getWifiApConfiguration", newClass[0]);            if(localMethod == null) returnnull;            Object localObject1 = localMethod.invoke(this.mWifiManager,newObject[0]);            if(localObject1 == null) returnnull;            WifiConfiguration localWifiConfiguration = (WifiConfiguration) localObject1;            if(localWifiConfiguration.SSID != null) returnlocalWifiConfiguration.SSID;            Field localField1 = WifiConfiguration.class.getDeclaredField("mWifiApProfile");            if(localField1 == null) returnnull;            localField1.setAccessible(true);            Object localObject2 = localField1.get(localWifiConfiguration);            localField1.setAccessible(false);            if(localObject2 == null)  returnnull;            Field localField2 = localObject2.getClass().getDeclaredField("SSID");            localField2.setAccessible(true);            Object localObject3 = localField2.get(localObject2);            if(localObject3 == null) returnnull;            localField2.setAccessible(false);            String str = (String) localObject3;            returnstr;        } catch(Exception localException) {        }        returnnull;    }                                                                                                                                                              /**获取wifi名**/    publicString getBSSID() {        if(this.mWifiInfo == null)            return"NULL";        returnthis.mWifiInfo.getBSSID();    }                                                                                                                                                           /**得到配置好的网络 **/    publicList<WifiConfiguration> getConfiguration() {        returnthis.mWifiConfiguration;    }                                                                                                                                                              /**获取ip地址**/    publicintgetIPAddress() {        return(mWifiInfo == null) ? 0: mWifiInfo.getIpAddress();    }    /**获取物理地址(Mac)**/    publicString getMacAddress() {         return(mWifiInfo == null) ? "NULL": mWifiInfo.getMacAddress();    }                                                                                                                                                                  /**获取网络id**/    publicintgetNetworkId() {         return(mWifiInfo == null) ? 0: mWifiInfo.getNetworkId();    }    /**获取热点创建状态**/    publicintgetWifiApState() {        try{            inti = ((Integer) this.mWifiManager.getClass()                    .getMethod("getWifiApState", newClass[0])                    .invoke(this.mWifiManager, newObject[0])).intValue();            returni;        } catch(Exception localException) {        }        return4;   //未知wifi网卡状态    }    /**获取wifi连接信息**/    publicWifiInfo getWifiInfo() {        returnthis.mWifiManager.getConnectionInfo();    }    /** 得到网络列表**/    publicList<ScanResult> getWifiList() {        returnthis.mWifiList;    }                                                                                                                                                            /**查看扫描结果**/    publicStringBuilder lookUpScan() {        StringBuilder localStringBuilder = newStringBuilder();        for(inti = 0; i < mWifiList.size(); i++)        {            localStringBuilder.append("Index_"+newInteger(i + 1).toString() + ":");            //将ScanResult信息转换成一个字符串包            //其中把包括:BSSID、SSID、capabilities、frequency、level            localStringBuilder.append((mWifiList.get(i)).toString());            localStringBuilder.append("\n");        }        returnlocalStringBuilder;    }                                                                                                                                                                /** 设置wifi搜索结果 **/    publicvoidsetWifiList() {        this.mWifiList = this.mWifiManager.getScanResults();    }    /**开始搜索wifi**/    publicvoidstartScan() {        this.mWifiManager.startScan();    }    /**得到接入点的BSSID**/    publicString GetBSSID() {        return(mWifiInfo == null) ? "NULL": mWifiInfo.getBSSID();    }} | 
最后,成功连接到wifi后,通过本机IP地址便可以进行相关网络开发,在下一篇中我会讲解一个WIFI热点搜索、创建、连接的Demo(http://smallwoniu.blog.51cto.com/3911954/1338618),希望能帮助到大家!
【移动开发】Android中WIFI开发总结(一)的更多相关文章
- 【移动开发】Android中WIFI开发总结(二)
		搞了好几天终于有点眉目了,这里接着总结一下Android中WiFi的使用,在前面(http://smallwoniu.blog.51cto.com/3911954/1334951)我们已经简单了解了W ... 
- 用C++语言开发Android程序 配置开发环境
		转自:http://www.cnblogs.com/yaotong/p/3622430.html 用C++语言开发Android程序 配置开发环境 如果你是一个C++语言的死忠,你喜欢C++语言到 ... 
- (转载)所有分类  >  开发语言与工具  >  移动开发  >  Android开发 Android中的Service:默默的奉献者 (1)
		前言 这段时间在看一些IPC相关的东西,这里面就不可避免的要涉及到service,进程线程这些知识点,而且在研究的过程中我惊觉自己对这些东西的记忆已经开始有些模糊了——这可要不得.于是我就干脆花了点心 ... 
- 【Android】wifi开发
		WIFI就是一种无线联网技术,常见的是使用无线路由器.那么在这个无线路由器的信号覆盖的范围内都可以采用WIFI连接的方式进行联网.如果无线路由器连接了一个ADSL线路或其他的联网线路,则又被称为“热点 ... 
- android之wifi开发
		WIFI就是一种无线联网技术,常见的是使用无线路由器.那么在这个无线路由器的信号覆盖的范围内都可以采用WIFI连接的方式进行联网.如果无线路由器连接了一个ADSL线路或其他的联网线路,则又被称为“热点 ... 
- Android多媒体开发-- android中OpenMax的实现整体框架
		1.android中用openmax来干啥? android中的AwesomePlayer就 是用openmax来做(code)编解码,其实在openmax接口设计中,他不光能用来当编解码.通过他的组 ... 
- [Android学习笔记]Android中多线程开发的一些概念
		线程安全: 在多线程的情况下,不会因为线程之间的操作而导致数据错误. 线程同步: 同一个资源,可能在同一时间被多个线程操作,这样会导致数据错误.这是一个现象,也是一个问题,而研究如何解决此类问题的相关 ... 
- (转载)Android开发——Android中常见的4种线程池(保证你能看懂并理解)
		0.前言 转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52415337 使用线程池可以给我们带来很多好处,首先通过线程池中线程的重用 ... 
- Android开发——Android中常见的4种线程池(保证你能看懂并理解)
		0.前言 转载请注明出处:http://blog.csdn.net/seu_calvin/article/details/52415337 使用线程池可以给我们带来很多好处,首先通过线程池中线程的重用 ... 
随机推荐
- 关于SVD(Singular Value Decomposition)的那些事儿
			SVD简介 SVD不仅是一个数学问题,在机器学习领域,有相当多的应用与奇异值都可以扯上关系,比如做feature reduction的PCA,做数据压缩(以图像压缩为代表)的算法,还有做搜索引擎语义层 ... 
- hibernate_validator_05
			校验约束 一,认识Validator---Validation中最主要的接口 1.怎么获取一个Validator--Validation.buildDefaultValidatorFactory() ... 
- I/O复用-select模型
			IO复用: I/O复用使得程序可以同时监听多个文件描述符,这对提高程序的性能至关重要.例如TCP服务器要同时处理监听socket和连接socket,客户端要同时处理用户输入和网络连接. Linux下实 ... 
- (转)C++静态库与动态库
			本文出自 http://www.cnblogs.com/skynet/p/3372855.html 吴秦 什么是库 库是写好的现有的,成熟的,可以复用的代码.现实中每个程序都要依赖很多基础的底层库,不 ... 
- UVA 10254 - The Priest Mathematician (dp | 汉诺塔 | 找规律 | 大数)
			本文出自 http://blog.csdn.net/shuangde800 题目点击打开链接 题意: 汉诺塔游戏请看 百度百科 正常的汉诺塔游戏是只有3个柱子,并且如果有n个圆盘,至少需要2^n- ... 
- 在ubuntu14.04上安装oracle java6 java7的方法
			注意: Debian建议安装openjdk,在release包中已包含. oracle的java需要自己安装,安装步骤如下: 1. 首先安装java-package,安装方法:apt-get inst ... 
- 面向对象设计模式之Facade外观模式(结构型)
			动机:有些系统组件的客户和组件中各种复杂的子系统有了过多的的耦合,随着外部客户程序 和个子系统的演化,这种过多的耦合面临很多变化的挑战:如何简化外部客户程序和系统的交互接口? 如何将外部客户程序的 ... 
- 《FPGA零基础入门到精通视频教程》-第002计数器(Modelsim前仿真)
			高清视频和配套讲义这里下载 http://www.fpgaw.com/thread-68524-1-1.html 优酷视频 
- 关于cmd的东西
			为了督促自己,就从简单的开始学起,希望用博客来纪念我的成长 1)输入 CMD 回车.进入DOS提示符状态下.输入cd\ 回车 表示进入 c:\> 也到了C盘根目录下 2)d: 回车 是进入D盘当 ... 
- PCB模擬設計接地的指導原則
			接地無疑是系統設計中最為棘手的問題之一.盡管它的概念相對比較簡單,實施起來卻很復雜,遺憾的是,它沒有一個簡明扼要可以用詳細步驟描述的方法來保證取得良好效果,但如果在某些細節上處理不當,可能會導致令人頭 ... 
