Android培训

亿元级外企Android培训企业

  • 全国服务监督电话4001118989
  • Android中WIFI开发总结,Android开发WIFI教程

    发布:Android培训  来源:Android学习笔记  时间: 2017年05月17日

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

  • 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开发中比较常见的内存泄漏问题及解决办法

网站导航
2001-2016 达内时代科技集团有限公司 版权所有 京ICP证8000853号-56