Android WiFi模块学习

转自:http://www.th7.cn/Program/Android/201303/130087.shtml

wifi模块简介

android本身已经提供了包来处理Android环境下对Wifi的操作,位置是android.net.wifi下面。调用wifi操作需要在mainfest中添加对应权限。

主要功能类

官方提供的大致可以分为四个主要的类:WifiManager,ScanResult,WifiConfiguration,WifiInfo,此外还有WifiLock,MulticastLock等

WifiManager

提供wifi管理的各种主要API,主要包含wifi的扫描,建立连接,配置等

http://developer.android.com/reference/android/net/wifi/WifiManager.html

ScanResult

描述开启扫描后的Wifi热点的信息。包含SSID、Capabilities、frequency、level(信号强度)等。

http://developer.android.com/reference/android/net/wifi/ScanResult.html

WifiConfiguration

描述wifi的连接信息,包含SSID、SSID隐藏、Password等的设置。

http://developer.android.com/reference/android/net/wifi/WifiConfiguration.html

WifiInfo

描述已建立连接后的wifi信息。包含ip、mac地址、连接速度等信息。区别与ScanResult的概念。

http://developer.android.com/reference/android/net/wifi/WifiInfo.html

常用功能代码

获取WifiManager

WifiManager wm = (WifiManager) this.getSystemService(Context.WIFI_SERVICE);

设置wifi功能开启

bRet = wifiManager.isWifiEnabled();//判断是否开启

bRet = wifiManager.setWifiEnabled(true);//设置开启关闭

注意,调用setWifiEnabled后,系统进行wifi模块的开启需要一定时间,此时通过wifiManager.getWifiState()获取的状态来判断是否完成。

WifiManager.WIFI_STATE_DISABLED : WIFI网卡不可用(1)

WifiManager.WIFI_STATE_DISABLING : WIFI网卡正在关闭(0)

WifiManager.WIFI_STATE_ENABLED : WIFI网卡可用(3)

WifiManager.WIFI_STATE_ENABLING : WIFI网正在打开(2) (WIFI启动需要一段时间)

WifiManager.WIFI_STATE_UNKNOWN  : 未知网卡状态

while (wifiManager.getWifiState() == WifiManager.WIFI_STATE_ENABLING) {                            try {                                     Thread.currentThread();                                     Thread.sleep(100);                            } catch (InterruptedException ie) {                            }                   }

扫描附近接入点AP

List<ScanResult> list = null;if ( wifiManager.startScan())list = wifiManager.getScanResults();

获取AP的信号强度、频率等

scanResult.level  //信号强度scanResult.frequency  //频率

获取手机中保存过配置的连接信息

List<WifiConfiguration> existingConfigs = wifiManager.getConfiguredNetworks();//获取保存的配置信息

判断某ssid的AP是否有保存过配置信息

for (WifiConfiguration existingConfig : existingConfigs) {             if (existingConfig.SSID.equals("/"" + SSID + "/"")) {                       return existingConfig;           }}

关闭Wifi连接

wifiManager.disableNetwork(existingConfig.networkId);

移除Wifi连接配置

wifiManager.removeNetwork(networkId);

注意与上面的disableNetwork的区别。Disable只是单纯的断开连接,保存的ssid和密码并不清除。

Remove则是从手机中移除(忘记)该连接配置,用来清除保存的密码

在网络正常连接的状态,也可直接调用remove来代替disable中断网络,但会清除密码信息。

创建连接Configuration

public WifiConfiguration CreateWifiConfig(String SSID, String Password,   WifiCipherType Type) {                  WifiConfiguration config = new WifiConfiguration();                                     config.allowedAuthAlgorithms.clear();                   config.allowedGroupCiphers.clear();                   config.allowedKeyManagement.clear();                   config.allowedPairwiseCiphers.clear();                   config.allowedProtocols.clear();                                     config.SSID = "/"" + SSID + "/"";                                     

//无密码                   if (Type == WifiCipherType.WIFICIPHER_NOPASS) {                            config.wepKeys[0] = "";                            config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);                            config.wepTxKeyIndex = 0;                   }                                     

//WEP加密                   if (Type == WifiCipherType.WIFICIPHER_WEP) {                            config.preSharedKey = "/"" + Password + "/"";                            config.hiddenSSID = true;                            config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);                            config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);                            config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);                            config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);                            config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);                            config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);                            config.wepTxKeyIndex = 0;                   }                                     //WPA加密                   if (Type == WifiCipherType.WIFICIPHER_WPA) {                                config.preSharedKey = "/"" + Password + "/"";                                config.hiddenSSID = true;                                // config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);                                // config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);                                // config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);                                // config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);                                // config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);                                // config.status = WifiConfiguration.Status.ENABLED; } else {                                return null;                   }                       return config;         }

添加、开启一个wifi

public boolean addNewWifi(WifiConfiguration newConfig){                   int netID = wifiManager.addNetwork(newConfig);//添加                   boolean bRet = wifiManager.enableNetwork(netID, false);//启动                   return bRet;         } 

获取目前的WifiInfo(IP、mac等)

WifiInfo wInfo = wifiManager.getConnectionInfo();//获取当前连接的info wInfo.getBSSID();// 获取BSSIDwInfo.getHiddenSSID();// 获得SSID 是否被隐藏wInfo.getIpAddress();// 获取IP 地址wInfo.getLinkSpeed();// 获得连接的速度wInfo.getMacAddress();// 获得Mac 地址wInfo.getRssi();// 获得802.11n 网络的信号wInfo.getSSID();// 获得SSIDSupplicantState suppState = wInfo.getSupplicantState();// 返回具体客户端状态的信息wInfo.getDetailedStateOf(suppState);// 获取客户端的连通性 

相关权限

修改网络状态的权限<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE" ></uses-permission> 修改WIFI状态的权限<uses-permission android:name="android.permission.CHANGE_WIFI_STATE" ></uses-permission> 访问网络权限<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" ></uses-permission> 访问WIFI权限<uses-permission android:name="android.permission.ACCESS_WIFI_STATE" ></uses-permission>
时间: 2024-10-11 03:18:21

Android WiFi模块学习的相关文章

Android WIFI模块分析

一:什么是WIFI WIFI是一种无线连接技术,可用于手机.电脑.PDA等终端.WIFI技术产生的目的是改善基于IEEE802.11标准的无线网络产品之间的互通性,也就是说WIFI是基于802.11标准的,但WIFI不等同无线网络. 二:Android平台下的WIFI模块 简单介绍一下,WIFI模块的基本功能: 1. 开关WIFI 除了在WIFI设置界面可以开关WIFI,还有其他的方法可以设置,要查看这些开关状态是否一致.还有就是飞行模式对WIFI开关的影响,由于WIFI开和关都有一个时间过程,

Android FM模块学习之四源码解析(二)

上一章我们了解了FM主activity:FMRadio.java,若没查看的,请打开链接Android FM模块学习之四源码解析(一) 查看fmradio.java源码注释.接下来我们来看看FM重要的一个类:FMRadioService.java 由上一章我们已经知道,打开FM时,在OnStart函数中会bindToService来开启服务, public boolean bindToService(Context context, ServiceConnection callback) { L

Android各模块学习比较好的文章

学习Android,个人建议是从Android官网进行学习,官网包括你想要的任何内容,如果觉得Android官网看不懂,我根据Android各个模块搜集了国内比较好的一些文章,可以根据自己的需求有选择的进行针对性学习. Android官网:http://developer.android.com/index.html Android官网国内镜像(可以不翻墙访问Android官网的内容):http://wear.techbrood.com/ Android Training模块中文翻译:http:

Android Bluetooth模块学习笔记

一.蓝牙基础知识 1.蓝牙( Bluetooth )是一种无线技术标准,可实现固定设备.移动设备和楼宇个人域网之间的短距离数据交换.蓝牙基于设备低成本的收发器芯片,传输距离近.低功耗. 2.微波频段:使用2.402GGHz到2.480GHz(包括防护频带)的ISM波段的UHF无线电波 3.蓝牙使用跳频技术,将传输的数据分割成数据包,通过79个指定的蓝牙频道分别传输数据包.每个频道的频宽为1MHz. 4.蓝牙是基于数据包.有着主从架构的协议.一个主设备至多可和同一微微网中的七个从设备通讯.所有设备

Android FM模块学习之二 FM搜索频道

最近在学习FM模块,FM是一个值得学习的模块,可以从上层看到底层.上层就是FM的按扭操作和界面显示,从而调用到FM底层驱动来实现广播收听的功能. 看看FM启动流程:如下图: 先进入FMRadio.java类,onCreate初始化一些数据,画出FM界面,启动fm在onStart()方法里启动FMRadioService.java (调用bindToService(this, osc)方法). 注册下fm设置(在设置后发送一个设置广播,更新FMRadio类的状态). 加载初始化数据,获取频率地址

Android FM模块学习之一 FM启动流程

转自:http://blog.csdn.net/tfslovexizi/article/details/41283743 最近在学习FM模块,FM是一个值得学习的模块,可以从上层看到底层.上层就是FM的按扭操作和界面显示,从而调用到FM底层驱动来实现广播收听的功能. 看看Fm启动流程:如下图: 先进入FMRadio.java类,onCreate初始化一些数据,画出FM界面,启动fm在onStart()方法里启动FMRadioService.java (调用bindToService(this,

Android FM模块学习之四源码分析(3)

接着看FM模块的其他几个次要的类的源码.这样来看FM上层的东西不是太多. 请看android\vendor\qcom\opensource\fm\fmapp2\src\com\caf\fmradio\Settings.java protected void onCreate(BundlesavedInstanceState) 从FMRadio.java用使用Intent跳转携带参数过来,在onCreate获取携带数据. protected void onCreate(Bundle savedIn

Android FM模块学习之四源码解析(三)

由于最近一直忙项目,没有时间来更新文档,今天抽空来写一点,希望大家可以学习使用! 这一章当然还是来分析FM模块的源码.FmReceiver.java publicFmReceiver(String devicePath,FmRxEvCallbacksAdaptor callback) throwsInstantiationException { mControl = new FmRxControls(); mRxEvents = new FmRxEventListner(); //registe

Android FM模块学习之源码分析(六)

现在是2015年1月啦,得改口说去年了,去年抽时间整理了一些FM模块的主要源码类的东西,今年再整理一下几个次要的类的源码.这样来看FM上层的东西不是太多. 请看android\vendor\qcom\opensource\fm\fmapp2\src\com\caf\fmradio\Settings.java protected void onCreate(BundlesavedInstanceState) 从FMRadio.java用使用Intent跳转携带参数过来,在onCreate获取携带数