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-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管理工具类)

package com.zhf.wifidemo.wifi.utils;import java.lang.reflect.Field;import java.lang.reflect.Method;import java.util.Iterator;import java.util.List;import android.content.Context;import android.net.wifi.ScanResult;import android.net.wifi.WifiConfiguration;import android.net.wifi.WifiInfo;import android.net.wifi.WifiManager;/** * WIFI管理类 * @author ZHF * */public class WifiAdmin {    private static  WifiAdmin wifiAdmin = null;                                                                                                                                                              private List<WifiConfiguration> mWifiConfiguration; //无线网络配置信息类集合(网络连接列表)    private List<ScanResult> mWifiList; //检测到接入点信息类 集合                                                                                                                                                              //描述任何Wifi连接状态    private WifiInfo mWifiInfo;                                                                                                                                                              WifiManager.WifiLock mWifilock; //能够阻止wifi进入睡眠状态,使wifi一直处于活跃状态    public WifiManager mWifiManager;                                                                                                                                                              /**     * 获取该类的实例(懒汉)     * @param context     * @return     */    public static WifiAdmin getInstance(Context context) {        if(wifiAdmin == null) {            wifiAdmin = new WifiAdmin(context);            return wifiAdmin;        }        return null;    }    private WifiAdmin(Context context) {        //获取系统Wifi服务   WIFI_SERVICE        this.mWifiManager = (WifiManager) context.getSystemService("wifi");        //获取连接信息        this.mWifiInfo = this.mWifiManager.getConnectionInfo();    }                                                                                                                                                              /**     * 是否存在网络信息     * @param str  热点名称     * @return     */    private WifiConfiguration isExsits(String str) {        Iterator localIterator = this.mWifiManager.getConfiguredNetworks().iterator();        WifiConfiguration localWifiConfiguration;        do {            if(!localIterator.hasNext()) return null;            localWifiConfiguration = (WifiConfiguration) localIterator.next();        }while(!localWifiConfiguration.SSID.equals("\"" + str + "\""));        return localWifiConfiguration;    }                                                                                                                                                              /**锁定WifiLock,当下载大文件时需要锁定 **/    public void AcquireWifiLock() {        this.mWifilock.acquire();    }    /**创建一个WifiLock**/    public void CreateWifiLock() {        this.mWifilock = this.mWifiManager.createWifiLock("Test");    }    /**解锁WifiLock**/    public void ReleaseWifilock() {        if(mWifilock.isHeld()) { //判断时候锁定            mWifilock.acquire();        }    }                                                                                                                                                                                                                                                                                                                        /**打开Wifi**/    public void OpenWifi() {        if(!this.mWifiManager.isWifiEnabled()){ //当前wifi不可用            this.mWifiManager.setWifiEnabled(true);        }    }    /**关闭Wifi**/    public void closeWifi() {        if(mWifiManager.isWifiEnabled()) {            mWifiManager.setWifiEnabled(false);        }    }    /**端口指定id的wifi**/    public void disconnectWifi(int paramInt) {        this.mWifiManager.disableNetwork(paramInt);    }                                                                                                                                                              /**添加指定网络**/    public void addNetwork(WifiConfiguration paramWifiConfiguration) {        int i = mWifiManager.addNetwork(paramWifiConfiguration);        mWifiManager.enableNetwork(i, true);    }                                                                                                                                                              /**     * 连接指定配置好的网络     * @param index 配置好网络的ID     */    public void connectConfiguration(int index) {         // 索引大于配置好的网络索引返回          if (index > mWifiConfiguration.size()) {             return;         }         //连接配置好的指定ID的网络          mWifiManager.enableNetwork(mWifiConfiguration.get(index).networkId, true);     }                                                                                                                                                              /**     * 根据wifi信息创建或关闭一个热点     * @param paramWifiConfiguration     * @param paramBoolean 关闭标志     */    public void createWifiAP(WifiConfiguration paramWifiConfiguration,boolean paramBoolean) {        try {            Class localClass = this.mWifiManager.getClass();            Class[] arrayOfClass = new Class[2];            arrayOfClass[0] = WifiConfiguration.class;            arrayOfClass[1] = Boolean.TYPE;            Method localMethod = localClass.getMethod("setWifiApEnabled",arrayOfClass);            WifiManager localWifiManager = this.mWifiManager;            Object[] arrayOfObject = new Object[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     */    public WifiConfiguration createWifiInfo(String ssid, String passawrd,int paramInt, String type) {        //配置网络信息类        WifiConfiguration localWifiConfiguration1 = new WifiConfiguration();        //设置配置网络属性        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;            } else if(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;            } else if (paramInt == 2) { //简单密码                localWifiConfiguration1.hiddenSSID = true;//网络上不广播ssid                localWifiConfiguration1.wepKeys[0] = passawrd;            } else if (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);            }        }        return localWifiConfiguration1;    }                                                                                                                                                              /**获取热点名**/    public String getApSSID() {        try {            Method localMethod = this.mWifiManager.getClass().getDeclaredMethod("getWifiApConfiguration", new Class[0]);            if (localMethod == null) return null;            Object localObject1 = localMethod.invoke(this.mWifiManager,new Object[0]);            if (localObject1 == null) return null;            WifiConfiguration localWifiConfiguration = (WifiConfiguration) localObject1;            if (localWifiConfiguration.SSID != null) return localWifiConfiguration.SSID;            Field localField1 = WifiConfiguration.class .getDeclaredField("mWifiApProfile");            if (localField1 == null) return null;            localField1.setAccessible(true);            Object localObject2 = localField1.get(localWifiConfiguration);            localField1.setAccessible(false);            if (localObject2 == null)  return null;            Field localField2 = localObject2.getClass().getDeclaredField("SSID");            localField2.setAccessible(true);            Object localObject3 = localField2.get(localObject2);            if (localObject3 == null) return null;            localField2.setAccessible(false);            String str = (String) localObject3;            return str;        } catch (Exception localException) {        }        return null;    }                                                                                                                                                              /**获取wifi名**/    public String getBSSID() {        if (this.mWifiInfo == null)            return "NULL";        return this.mWifiInfo.getBSSID();    }                                                                                                                                                           /**得到配置好的网络 **/    public List<WifiConfiguration> getConfiguration() {        return this.mWifiConfiguration;    }                                                                                                                                                              /**获取ip地址**/    public int getIPAddress() {        return (mWifiInfo == null) ? 0 : mWifiInfo.getIpAddress();    }    /**获取物理地址(Mac)**/    public String getMacAddress() {         return (mWifiInfo == null) ? "NULL" : mWifiInfo.getMacAddress();    }                                                                                                                                                                   /**获取网络id**/    public int getNetworkId() {         return (mWifiInfo == null) ? 0 : mWifiInfo.getNetworkId();    }    /**获取热点创建状态**/    public int getWifiApState() {        try {            int i = ((Integer) this.mWifiManager.getClass()                    .getMethod("getWifiApState", new Class[0])                    .invoke(this.mWifiManager, new Object[0])).intValue();            return i;        } catch (Exception localException) {        }        return 4;   //未知wifi网卡状态    }    /**获取wifi连接信息**/    public WifiInfo getWifiInfo() {        return this.mWifiManager.getConnectionInfo();    }    /** 得到网络列表**/    public List<ScanResult> getWifiList() {        return this.mWifiList;    }                                                                                                                                                            /**查看扫描结果**/    public StringBuilder lookUpScan() {        StringBuilder localStringBuilder = new StringBuilder();        for (int i = 0; i < mWifiList.size(); i++)        {            localStringBuilder.append("Index_"+new Integer(i + 1).toString() + ":");            //将ScanResult信息转换成一个字符串包            //其中把包括:BSSID、SSID、capabilities、frequency、level            localStringBuilder.append((mWifiList.get(i)).toString());            localStringBuilder.append("\n");        }        return localStringBuilder;    }                                                                                                                                                                /** 设置wifi搜索结果 **/    public void setWifiList() {        this.mWifiList = this.mWifiManager.getScanResults();    }    /**开始搜索wifi**/    public void startScan() {        this.mWifiManager.startScan();    }    /**得到接入点的BSSID**/    public String GetBSSID() {        return (mWifiInfo == null) ? "NULL" : mWifiInfo.getBSSID();    }}


最后,成功连接到wifi后,通过本机IP地址便可以进行相关网络开发,在下一篇中我会讲解一个WIFI热点搜索、创建、连接的Demo(http://smallwoniu.blog.51cto.com/3911954/1338618),希望能帮助到大家!



更多相关文章

  1. android (java) 网络发送get/post请求参数设置
  2. Android利用Fiddler进行网络数据抓包
  3. android中使用线程池和临时缓存优化网络图片加载
  4. Android作为服务端,PC推送消息
  5. 【Android教程】Android(安卓)Studio找不到连接的手机完全解决办
  6. [原创]Android中LocationManager的简单使用,获取当前位置
  7. Android中几种图像特效处理的集锦!!!
  8. 【Android】私有目录获取方法
  9. Android(安卓)判断网络状态

随机推荐

  1. android批量文件上传(android批量图片上传
  2. Android(安卓)图片内存溢出(Out of Memory
  3. 7种例子讲解Android(安卓)Dialog!
  4. Android(安卓)蓝牙串口调试程序开发
  5. 深入Android开发FAQ的详解
  6. [置顶] android图形系统详解六:View layer
  7. Android添加可拖动、点击的悬浮窗口
  8. React Native 中的状态栏(Android沉浸式)
  9. 整个网络可能最完善的 Android(安卓)自定
  10. Socket 通信原理 -- Android客户端和服务