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地址。

networkid:网络ID。

PreSharedKey:无线网络的安全认证模式。

SSID:SSID(Service Set Identif)用于标识无线局域网,SSID不同的无线网络是无法进行互访的。


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操作的权限设置

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

下面是汇总的一个wifi管理工具类,我完善了一下,并加上了详细的注解,很实用的!

WifiAdmin类: (wifi管理工具类)

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管理类*@authorZHF**/publicclassWifiAdmin{privatestaticWifiAdminwifiAdmin=null;privateList<WifiConfiguration>mWifiConfiguration;//无线网络配置信息类集合(网络连接列表)privateList<ScanResult>mWifiList;//检测到接入点信息类集合//描述任何Wifi连接状态privateWifiInfomWifiInfo;WifiManager.WifiLockmWifilock;//能够阻止wifi进入睡眠状态,使wifi一直处于活跃状态publicWifiManagermWifiManager;/***获取该类的实例(懒汉)*@paramcontext*@return*/publicstaticWifiAdmingetInstance(Contextcontext){if(wifiAdmin==null){wifiAdmin=newWifiAdmin(context);returnwifiAdmin;}returnnull;}privateWifiAdmin(Contextcontext){//获取系统Wifi服务WIFI_SERVICEthis.mWifiManager=(WifiManager)context.getSystemService("wifi");//获取连接信息this.mWifiInfo=this.mWifiManager.getConnectionInfo();}/***是否存在网络信息*@paramstr热点名称*@return*/privateWifiConfigurationisExsits(Stringstr){IteratorlocalIterator=this.mWifiManager.getConfiguredNetworks().iterator();WifiConfigurationlocalWifiConfiguration;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(WifiConfigurationparamWifiConfiguration){inti=mWifiManager.addNetwork(paramWifiConfiguration);mWifiManager.enableNetwork(i,true);}/***连接指定配置好的网络*@paramindex配置好网络的ID*/publicvoidconnectConfiguration(intindex){//索引大于配置好的网络索引返回if(index>mWifiConfiguration.size()){return;}//连接配置好的指定ID的网络mWifiManager.enableNetwork(mWifiConfiguration.get(index).networkId,true);}/***根据wifi信息创建或关闭一个热点*@paramparamWifiConfiguration*@paramparamBoolean关闭标志*/publicvoidcreateWifiAP(WifiConfigurationparamWifiConfiguration,booleanparamBoolean){try{ClasslocalClass=this.mWifiManager.getClass();Class[]arrayOfClass=newClass[2];arrayOfClass[0]=WifiConfiguration.class;arrayOfClass[1]=Boolean.TYPE;MethodlocalMethod=localClass.getMethod("setWifiApEnabled",arrayOfClass);WifiManagerlocalWifiManager=this.mWifiManager;Object[]arrayOfObject=newObject[2];arrayOfObject[0]=paramWifiConfiguration;arrayOfObject[1]=Boolean.valueOf(paramBoolean);localMethod.invoke(localWifiManager,arrayOfObject);return;}catch(Exceptione){e.printStackTrace();}}/***创建一个wifi信息*@paramssid名称*@parampassawrd密码*@paramparamInt有3个参数,1是无密码,2是简单密码,3是wap加密*@paramtype是"ap"还是"wifi"*@return*/publicWifiConfigurationcreateWifiInfo(Stringssid,Stringpassawrd,intparamInt,Stringtype){//配置网络信息类WifiConfigurationlocalWifiConfiguration1=newWifiConfiguration();//设置配置网络属性localWifiConfiguration1.allowedAuthAlgorithms.clear();localWifiConfiguration1.allowedGroupCiphers.clear();localWifiConfiguration1.allowedKeyManagement.clear();localWifiConfiguration1.allowedPairwiseCiphers.clear();localWifiConfiguration1.allowedProtocols.clear();if(type.equals("wt")){//wifi连接localWifiConfiguration1.SSID=("\""+ssid+"\"");WifiConfigurationlocalWifiConfiguration2=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;//网络上不广播ssidlocalWifiConfiguration1.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;}/**获取热点名**/publicStringgetApSSID(){try{MethodlocalMethod=this.mWifiManager.getClass().getDeclaredMethod("getWifiApConfiguration",newClass[0]);if(localMethod==null)returnnull;ObjectlocalObject1=localMethod.invoke(this.mWifiManager,newObject[0]);if(localObject1==null)returnnull;WifiConfigurationlocalWifiConfiguration=(WifiConfiguration)localObject1;if(localWifiConfiguration.SSID!=null)returnlocalWifiConfiguration.SSID;FieldlocalField1=WifiConfiguration.class.getDeclaredField("mWifiApProfile");if(localField1==null)returnnull;localField1.setAccessible(true);ObjectlocalObject2=localField1.get(localWifiConfiguration);localField1.setAccessible(false);if(localObject2==null)returnnull;FieldlocalField2=localObject2.getClass().getDeclaredField("SSID");localField2.setAccessible(true);ObjectlocalObject3=localField2.get(localObject2);if(localObject3==null)returnnull;localField2.setAccessible(false);Stringstr=(String)localObject3;returnstr;}catch(ExceptionlocalException){}returnnull;}/**获取wifi名**/publicStringgetBSSID(){if(this.mWifiInfo==null)return"NULL";returnthis.mWifiInfo.getBSSID();}/**得到配置好的网络**/publicList<WifiConfiguration>getConfiguration(){returnthis.mWifiConfiguration;}/**获取ip地址**/publicintgetIPAddress(){return(mWifiInfo==null)?0:mWifiInfo.getIpAddress();}/**获取物理地址(Mac)**/publicStringgetMacAddress(){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(ExceptionlocalException){}return4;//未知wifi网卡状态}/**获取wifi连接信息**/publicWifiInfogetWifiInfo(){returnthis.mWifiManager.getConnectionInfo();}/**得到网络列表**/publicList<ScanResult>getWifiList(){returnthis.mWifiList;}/**查看扫描结果**/publicStringBuilderlookUpScan(){StringBuilderlocalStringBuilder=newStringBuilder();for(inti=0;i<mWifiList.size();i++){localStringBuilder.append("Index_"+newInteger(i+1).toString()+":");//将ScanResult信息转换成一个字符串包//其中把包括:BSSID、SSID、capabilities、frequency、levellocalStringBuilder.append((mWifiList.get(i)).toString());localStringBuilder.append("\n");}returnlocalStringBuilder;}/**设置wifi搜索结果**/publicvoidsetWifiList(){this.mWifiList=this.mWifiManager.getScanResults();}/**开始搜索wifi**/publicvoidstartScan(){this.mWifiManager.startScan();}/**得到接入点的BSSID**/publicStringGetBSSID(){return(mWifiInfo==null)?"NULL":mWifiInfo.getBSSID();}}



更多相关文章

  1. Android(安卓)webview加载html页面根据点击确定选中的控件
  2. Android中LocationManager的简单使用,获取当前位置
  3. android开发中如何获得应用的数字签名
  4. android - 模拟器连接本地tomcat
  5. Android(安卓)如何让EditText不自动获取焦点
  6. Android(安卓)Uri获取资源文件(多种方式)
  7. android之view获取getWidth()和getHeight()
  8. Android之网络请求3————OkHttp的拦截器和封装
  9. Android获取屏幕分辨率及DisplayMetrics简介

随机推荐

  1. Android之事件处理全面剖析
  2. Android《第三章:AIDL与Messenger》
  3. Android 系统(125)---Android通过Dialer实
  4. 关于Android横竖屏切换的解决方法
  5. Textview的maxLines大于1行时,"android:el
  6. android XML解析详解(封装好的工具类)
  7. Android NDK: Host 'awk' tool is outdat
  8. android的响铃MediaPlayer
  9. 完美Android Cursor使用例子(Android数据
  10. Android的视频通话的Java代码