如何编写Android手机WiFi功能----Android篇

     

WIFI全称Wireless Fidelity,又称802.11b标准,它的最大优点就是传输速度较高,可以达到11Mbit/s。另外,它的有效距离也很长,同时也与已有的各种802.11 DSSS设备兼容。它是一种可以将计算机、手持设备(如PDA、手机)等终端以无线方式互相连接的技术。Wi-Fi是一个无线网络通信技术的品牌,由Wi-Fi联盟(Wi-Fi Alliance)所持有。

通俗点介绍WiFi,我们在用笔记本电脑上网时,往往是插上网线上网,但如果不用网线通过无线网络,连接无线路由器上网的话,就是用WiFi。手机同样也可以连接无线路由器上网,同样也称之为WiFi,并且速度也快,并且还不产生流量费用。现在无线网络很多,一般公共场合都可以搜索到几个热点,例如麦当劳、肯德基、上岛咖啡等,都有提供无线WiFi网络。

在Android手机上,WiFi是很常见并且很有用的一个功能。通过WiFi使用浏览器浏览网页、使用Market来下载免费软件、使用IM上MSN进行聊天、使用Gmail来收发邮件等。主要好处是速度快并且没有流量费。在Android手机中Wifi的设置非常的简单,先勾选WiFi功能,WiFi会自动搜索附近热点,然后就会列出热点列表,但一般都会有密码,点击热点输入密码就可轻松连接WiFi了。

学习Android手机WiFi代码编程

首先安装eclipse,开发Android,新建项目。

在Android手机中操作WiFi是很简单的,上面已经介绍了。在学习代码前,先了解下WiFi在Android系统中是怎样运行起来的和各个环节的配合;图:

下面是编写WiFi的代码:,需要在AndroidManifest.xml注册几个权限:

代码如下:


  
  
<uses-permissionandroid:nameuses-permissionandroid:name=" android.permission.CHANGE_NETWORK_STATE">  </uses-permission>  //修改网络状态的权限   <uses-permissionandroid:nameuses-permissionandroid:name=" android.permission.CHANGE_WIFI_STATE">  </uses-permission>  //修改WiFi状态的权限   <uses-permissionandroid:nameuses-permissionandroid:name=" android.permission.ACCESS_NETWORK_STATE">  </uses-permission>  //访问网络权限   <uses-permissionandroid:nameuses-permissionandroid:name=" android.permission.ACCESS_WIFI_STATE">  </uses-permission>  //访问WiFi权限  

WiFi操作时,网卡状态是由一些整型常量表示。

(1)WIFI_STATE_DISABLED:WiFi网卡不可用。

(2)WIFI_STATE_DISABLING:WiFi正在关闭。

(3)WIFI_STATE_ENABLED:WiFi网卡可用。

(4)WIFI_STATE_ENABLING:WiFi网卡正在打开。

(5)WIFI_STATE_UNKNOWN:未知网卡状态。

Android中WiFi的重要操作类和接口(ScanResult wifiConfiguration WifiInfo WifiManager)。

(1)ScanResult 主要是通过WiFi 硬件的扫描来获取一些周边的WiFi 热点的信息。包括接入点名称、信号强弱、安全模式、频率等。其构造函数中包含几个参数,下面简单介绍一下。

BSSID:接入点的地址,主要是指小范围几个无线设备相连接所获取的地址。

SSID:网络的名字,当搜索一个网络时,就是靠这个来区分每个不同的网络接入点。

Capabilities:网络接入的性能,这里主要是来判断网络的加密方式等。

Frequency:频率,每一个频道交互的MHz 数。

Level:等级,主要来判断网络连接的优先数。

(2)WifiConfiguration 配置WiFi网络,它包含了6个内部类。

WifiConfiguration.AuthAlgorthm 用来判断加密方法。

WifiConfiguration.GroupCipher 使用GroupCipher 的方法来进行加密。

WifiConfiguration.KeyMgmt 使用KeyMgmt 进行加密。

WifiConfiguration.PairwiseCipher 使用WPA 方式加密。

WifiConfiguration.Protocol 使用哪一种协议进行加密。

wifiConfiguration.Status 当前网络的状态。

(3)WifiInfo 得到WiFi信息,包括接入点。

getBSSID() 获取BSSID。

getDetailedStateOf() 获取客户端的连通性。

getHiddenSSID() 获得SSID 是否被隐藏。

getIpAddress() 获取IP 地址。

getLinkSpeed() 获得连接的速度。

getMacAddress() 获得Mac 地址。

getRssi() 获得802.11n 网络的信号。

getSSID() 获得SSID。

getSupplicanState() 返回具体客户端状态的信息。

代码编写功能

使用WifiManager 管理WiFi 。

addNetwork(WifiConfiguration config) 通过获取到的网络的链接状态信息来添加网络。

calculateSignalLevel(int rssi , int numLevels) 计算信号的等级。

compareSignalLevel(int rssiA, int rssiB) 对比连接A 和连接B。

createWifiLock(int lockType, String tag) 创建一个WiFi 锁,锁定当前的WiFi 连接。

disableNetwork(int netId) 让一个网络连接失效。

disconnect() 断开连接。

enableNetwork(int netId, Boolean disableOthers) 连接一个连接。

getConfiguredNetworks() 获取网络连接的状态。

getConnectionInfo() 获取当前连接的信息。

getDhcpInfo() 获取DHCP 的信息。

getScanResulats() 获取扫描测试的结果。

getWifiState() 获取一个WiFi 接入点是否有效。

isWifiEnabled() 判断一个WiFi 连接是否有效。

pingSupplicant() ping 一个连接,判断是否能连通。

ressociate() 即便连接没有准备好,也要连通。

reconnect() 如果连接准备好了,连通。

removeNetwork() 移除某一个网络。

saveConfiguration() 保留一个配置信息。

setWifiEnabled() 让一个连接有效。

startScan() 开始扫描。

updateNetwork(WifiConfiguration config) 更新一个网络连接的信息。

此外WifiManaer 还提供了两个内部的子类,MulticastLock和WifiManagerLock,分别简单介绍这两个内部类,MulticastLock允许一个应用程序接收多个无线网络的数据包;WifiManagerLock Wifi是网络锁的概念,一般情况当应用程序通过WiFi连接网络后,长时间不用,则网络自动关闭。如果利用WifiManagerLock锁定连接好的网络,那么就不会产生这种现象了,有锁定当然也有解除锁定。在使用过程中,WiFi的使用是一个耗电的过程,所以,应用程序又不能长时间进行网络连接。按照应用程序需求,一些耗时的操作就可以添加一个锁,简单请求就不用。

关于WiFi操作的例子,就不在Android平台开发了,此处给出一个自定义WiFi工具类,包含了WiFi的很多操作,如打开、关闭、锁定、解锁、扫描热点、WiFi配置、获取WiFi信息等。

代码实例:


  
  
package com.pms.wifi;     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;   import android.net.wifi.WifiManager.WifiLock;     public class WifiHandle {       private WifiManager wifiManager = null;       private WifiInfo wifiInfo = null;       private List<ScanResult> scanResultList = null;// 扫描出的网络连接列表       private List<WifiConfiguration> wifiConfigurationList = null;// 网络连接列表       private WifiLock wifiLock = null;         // 构造函数       public WifiHandle(Context context) {           wifiManager = (WifiManager) context           .getSystemService(context.WIFI_SERVICE);// 从系统服务中得到WifiManager           // 得到WiFi相关信息,包括MAX地址、接入点BSSID、IP地址、连接的ID           wifiInfo = wifiManager.getConnectionInfo();       }         // 打开WiFi       public void openWifi() {           if (!wifiManager.isWifiEnabled()) {               wifiManager.setWifiEnabled(true);           }       }         // 关闭WiFi       public void closeWife() {           if (wifiManager.isWifiEnabled()) {               wifiManager.setWifiEnabled(false);           }       }         // 锁定WiFi       public void lockWifi() {           wifiLock.acquire();       }         // 解锁WiFi       public void rlockWifi() {           if (wifiLock.isHeld()) {               wifiLock.acquire();           }       }         // 创建一个wifilock       public void createWifiLock() {           wifiLock = wifiManager.createWifiLock("Machao");       }         public List<WifiConfiguration> getConfingurationList() {           return wifiConfigurationList;// 得到配置好的网络       }         public void connectConfiguration(int index) {           if (index > wifiConfigurationList.size()) {               return;           }           wifiManager.enableNetwork(wifiConfigurationList.get(index).networkId,                   true);// 连接配置好的指定ID的网络       }         public void startScan() {           wifiManager.startScan();           // 得到扫描结果           scanResultList = wifiManager.getScanResults();           // 得到配置好的网络连接           wifiConfigurationList = wifiManager.getConfiguredNetworks();       }         // 得到网络列表       public List<ScanResult> getScanResultList() {           return scanResultList;       }         // 查看扫描结果       public StringBuilder lookUpScan() {           StringBuilder stringBuilder = new StringBuilder();           for (int i = 0; i < scanResultList.size(); i++) {               stringBuilder                       .append("Index_" + new Integer(i + 1).toString() + ":");               // 将ScanResult信息转换成一个字符串包               // 其中包括:BSSID、SSID、capabilities、frequency、level               stringBuilder.append((scanResultList.get(i)).toString());               stringBuilder.append("\n");           }           return stringBuilder;       }         // 得到MAC地址       public String getMacAddress() {           return (wifiInfo == null) ? "NULL" : wifiInfo.getMacAddress();       }         // 得到接入点的BSSID       public String getBSSID() {           return (wifiInfo == null) ? "NULL" : wifiInfo.getBSSID();       }         // 得到IP地址       public int getIPAddress() {           return (wifiInfo == null) ? 0 : wifiInfo.getIpAddress();       }         // 得到连接的ID       public int getNetworkId() {           return (wifiInfo == null) ? 0 : wifiInfo.getNetworkId();       }         // 得到WifiInfo的所有信息包       public String getWifiInfo() {           return (wifiInfo == null) ? "NULL" : wifiInfo.toString();       }         // 添加一个网络并连接       public void addNetwork(WifiConfiguration wcg) {           int wcgID = wifiManager.addNetwork(wcg);           wifiManager.enableNetwork(wcgID, true);       }         // 断开指定ID的网络       public void disconnectWifi(int netId) {           wifiManager.disableNetwork(netId);           wifiManager.disconnect();       }   }   OK,大功告成,可以进行WiFi测试啦。

end


转载于:https://my.oschina.net/bigfool007139/blog/548461

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值