Android培训
美国上市Android培训机构

400-111-8989

热门课程

Android中WIFI开发总结,Android开发WIFI教程

  • 时间:2017-05-17
  • 发布:Android培训
  • 来源:Android学习笔记

WIFI就是一种无线联网技术,常见的是使用无线路由器。那么在这个无线路由器的信号覆盖的范围内都可以采用WIFI连接的方式进行联网。如果无线路由器连接了一个ADSL线路或其他的联网线路,则又被称为“热点”。

在Android中对Wifi操作,android本身提供了一些有用的包,在android.net.wifi包下面,主要包括以下几个类和接口:

1.ScanResult
主要用来描述已经检测出的接入点,包括接入点的地址,接入点的名称,身份认证,频率,信号强度等信息。其实就是通过wifi硬件的扫描来获取一些周边的wifi热点的信息。

2.WifiConfiguration
Wifi网络的配置,包括安全设置等,在我们连通一个wifi接入点的时候,需要获取到的一些信息。主要包含四个属性:
BSSID:
BSS是一种特殊的Ad-hocLAN(一种支持点对点访问的无线网络应用模式)的应用,一个无线网络至少由一个连接到有线网络的AP和若干无线工作站组成,这种配置称为一个基本服务装置。一群计算机设定相同的BSS名称,即可自成一个group,而此BSS名称,即所谓BSSID。通常,手机WLAN中,bssid其实就是无线路由的MAC地址。
etworkid:网络ID。
PreSharedKey:无线网络的安全认证模式。
SSID:SSID(ServiceSetIdentif)用于标识无线局域网,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=0WIFI网卡正在关闭
WIFI_STATE_DISABLED=1WIFI网卡不可用
WIFI_STATE_ENABLING=2WIFI网正在打开(WIFI启动需要一段时间)
WIFI_STATE_ENABLED=3WIFI网卡可用
WIFI_STATE_UNKNOWN=4未知网卡状态
WIFI_AP_STATE_DISABLING=10WIFI热点正在关闭
WIFI_AP_STATE_DISABLED=11WIFI热点不可用
WIFI_AP_STATE_ENABLING=12WIFI热点正在打开
WIFI_AP_STATE_ENABLED=13WIFI热点可用

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_SERVICE
this.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;//网络上不广播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;
}

/**获取热点名**/
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、level
localStringBuilder.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();
}
}

最后,成功连接到wifi后,通过本机IP地址便可以进行相关网络开发,在下一篇中我会讲解一个WIFI热点搜索、创建、连接的
上一篇:Android系统架构图,带你直观了解Android基本架构
下一篇:5个Android开发中比较常见的内存泄漏问题及解决办法

Android开发工具、插件集合

分享一些应该常逛逛的一些Android开发技术社区

分享:Android 开发之从掉洞到填坑之路

Kotlin Android 基础知识学习笔记

选择城市和中心
贵州省

广西省

海南省

台湾