Android中WIFI开发总结(一)

本文深入探讨了Android中Wi-Fi操作的相关API,包括如何获取Wi-Fi信息、配置网络、连接和断开网络、创建Wi-Fi热点等核心功能。通过实际代码示例,详细解析了各个关键类和接口的作用与使用方法,旨在为开发者提供全面的Wi-Fi管理解决方案。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >


  • 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 = 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-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,希望能帮助到大家!

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值