Android Wi-Fi基本操作
从用户角度看,Android Wi-Fi模块自下向上可以看为5层:硬件驱动程序,wpa_suppplicant,JNI,WiFi API,WifiSettings应用程序。
1.wpa_supplicant是一个开源库,是android实现Wi-Fi功能的基础,它从上层接到命令后,通过Socket与硬件驱动进行通讯,操作硬件完成需要的操作。
2.JNI(Java Native Interface)实现了java代码与其他代码的交互,使得在java虚拟机中运行的java代码能够与其他语言编写的应用程序和库进行交互,在android中,JNI可以让java程序调用C程序。
3.Wi-Fi API使应用程序可以使用Wi-Fi的功能。
4.Wi-FI Settings应用程序是android中自带的一个应用程序,选择手机的Settings->WireLess & netWorks->Wi-Fi,可以让用户手动打开或关闭Wi-Fi功能。当用户打开Wi-Fi功能后,它会自动搜索周围的无线网络,并以列表的形式显示,供用户选择。默认会连接用户上一次成功连接的无线网络。
在android.net.wifi包中提供了一些类管理设备的Wi-Fi功能。主要包括ScanResult,wifiConfiguration,WifiInfo,WifiManager.
1.ScanResult
ScanResult主要是通过Wi-Fi硬件的扫描来获取一些周边的Wi-Fi热点的信息。该类包括以下五个域:
| 返回类型 | 域名 | 解释 |
| public String | BSSID | 接入点地址 |
| public String | SSID | 网络的名称 |
| public String | capabilities | 网络性能,包括介入点支持的认证,密钥管理,加密机制等 |
| public int | frequency | 以MHz为单位的接入频率 |
| public int | level | 以dBm为单位的信号强度 |
该类还提供了一个方法toString(),可将结果转换为简洁,易读的字符串形式。
2.wifiConfiguration类
通过该类可获取一个Wi-Fi网络的网络配置,包括安全配置等。该类包括六个子类,如下:
| 子类 | 解释 |
| WifiConfiguration.AuthAlgorthm | 获取IEEE802.11的加密方法 |
| WifiConfiguration.GroupCipher | 获取组密钥 |
| WifiConfiguration.KeyMgmt | 获取密码管理机制 |
| WifiConfiguration.PairwiseCipher | 获取WPA方式的成对密钥 |
| WifiConfiguration.Protocol | 获取机密协议 |
| WifiConfiguration.Status | 获取当前网络状态 |
每个子类都以常量形式给出相关的配置信息,有些还包括含域和方法。
3.WifiInfo类
通过该类可以获取已经建立或处于活动状态的Wi-Fi网络的状态信息。该类提供的方法较多,部分常用的如下:
| 方法 | 解释 |
| getBSSIS() | 获取当前接入点的BSSID |
| getIpAddress() | 获取IP地址 |
| getLinkSpeed() | 获取当前连接的速度 |
| getMacAddress() | 获取MAC地址 |
| getRssi() | 获得802.11n网络的信号强度指示 |
| getSSID() | 获得网络SSID |
| getSupplicanState() | 返回客户端状态的信息 |
4.wifiManager类
该类用于管理Wi-Fi连接,其定义了26个常量和23个方法。下面列出常用方法:
| 方法 | 解释 |
| addNetwork(WifiConfiguration config) | 向设置好的网络里添加新网络 |
| calculateSignalLevel(int rssi,int numLevels) | 计算信号的等级 |
| compareSignalLevel(int rssiA,int rssiB) | 对比两个信号的强度 |
| createWifiLock(int lockType,String tag) | 创建一个Wi-Fi锁,锁定当前的Wi-Fi连接 |
| disableNetWork(int netId) | 让一个网络连接失败 |
| disconnect() | 与当前接入点断连接 |
| enableNetwork(int netId,Boolean disableOthers) | 与之前设置好的网络建立连接 |
| getConfiguredNetworks() | 客户端获取网络连接状态 |
| getConnectionInfo() | 获取当前连接信息 |
| getDhcpInfo() | 获取DHCP信息 |
| getScanResult() | 获取扫描测试结果 |
| getWifiState() | 获取一个Wi-Fi接入点是否有效 |
| isWifiEnabled() | 判断一个Wi-Fi连接是否有效 |
| pingSupplicant() | 看看客户后台程序是否响应请求 |
| ressociate() | 重连到接入点,即使已经连接上了 |
| reconnect() | 如果现在没有连接的话,则重连接 |
| removeNetwork(int netId) | 移出某一个特定网络 |
| saveConfiguration() | 保留一个配置信息 |
| setWifiEnabled(boolean enabled) | 让一个连接有效或失效 |
| startScan() | 开始扫描 |
| updateNetwork(WifiConfiguration config) | 更新一个网络连接信息 |
需要指出的是,Wi-Fi网卡状态是由一系列的整型常量来表示的。
WIFI_STATE_DISABLED:Wi-Fi网卡不可用,用整型常量1表示。
WIFI_STATE_DISABLING:Wi-Fi网卡正在关闭,用整型常量0表示。
WIFI_STATE_ENABLED:Wi-Fi网卡可用,用整型常量3表示。
WIFI_STATE_ENABLING:Wi-Fi网卡正在打开,启动需要一段时间,用整型常量2表示。
WIFI_STATE_UNKNOWN:未知网卡状态,用整型常量4表示。
此外wifiManager还提供了一个子类wifiManagerLock.wifiManagerLock的作用是这样的:在普通的状态下,如果Wi-Fi的状态处于闲置,那么网络将会暂时中断;但是如果把当前的网络状态锁上,那么Wi-Fi连通将会保持在一定的状态,在结束锁定之后,才会恢复常态。
下面简单介绍一些方法的调用方式
private WifiInfo mWifiInfo;
private WifiManager mWifiManager;
1.获取WifiManager系统服务
mWifiManager=(WifiManager)context.getSystemService(Context.WIFI_SERVICE);
2.重新获取当前Wi-Fi的连接信息
public void againGetWifiInfo(){
mWifiInfo=mWifiManager.getConnectionInfo();
}
3.判断用户是否开启wi-fi网卡
public boolean isNetCardFriendly(){
return mWifiManager.isWifiEnabled();
}
4.判断当前是否连接Wi-Fi
private State state;
//创建连接管理器
private ConnectivityManager connManager;
public boolean isConnectioning(){
state=connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();
if(State.CONNECTING==state){
return true;
}else{
return false;
}
}
5.得到当前网络的连接状态
public State getCurrentState(){
state=connManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI).getState();
return state;
}
6.设置配置好的网络(有密码的网络并配置好密码),指定的
//网络连接列表
private List<WifiConfiguration> wifiConfigList=new ArrayList<WifiConfiguration>();
//Wi-Fi配置列表
private List<WifiConfiguration> wifiConfigedSpecifiedList=new ArrayList<WifiConfiguration>();
public void setWifiConfigedSpecifiedList(String ssid){
wifiConfigedSpecifiedList.clear();
if(wifiConfigList!=null){
for(WifiConfiguration item : wifiConfigList){
//如果是指定的网络,就加入列表
if(item.SSID.equalsIgnoreCase("\""+ssid+"\"")&& item.preSharedKey!=null){
//添加到列表中
wifiConfigedSpecifiedList.add(item);
}
}
}
}
7.返回Wi-Fi设置列表
public List<WifiConfiguration> getWifiConfigedSpecifiedList(){
return wifiConfigedSpecifiedList;
}
8.打开Wi-Fi网卡
public void openNetCard(){
if(!mWifiManager.isWifiEnabled()){
mWifiManager.setWifiEnabled(true);
}
}
9.关闭Wi-Fi网卡
public void closeNetCard(){
if(mWifiManager.isWifiEnabled()){
mWifiManager.setWifiEnabled(false);
}
}
10.检查当前Wi-Fi网卡状态
public void checkNetCardState(){
if(mWifiManager.getWifiState()==0){
Log.i("","网卡正在关闭");
}else if(mWifiManager.getWifiState()==1){
Log.i("","网卡已经关闭");
}else if(mWifiManager.getWifiState()==2){
Log.i("","网卡正在打开");
}else if(mWifiManager.getWifiState()==3){
Log.i("","网卡已经打开");
}else{
Log.i("","没有获取到状态");
}
}
11.扫描周边网络
//保存扫描结果列表
public List<ScanResult> listResult=new ArrayList<ScanResult>();
public void scan(){
//开始扫描
mWifiManager.startScan();
//获取扫描结果
listResult=mWifiManager.getScanResults();
//扫描配置列表
wifiConfigList=mWifiManager.getConfiguredNetworks();
if(listResult!=null){
//当前存在无线网络
}else{
//当前区域没有无线网络
}
}
12.返回扫描结果
public List<ScanResult> getListResult(){
return listResult;
}
13.得到扫描结果
//存储扫描结果
private StringBuffer mStringBuffer=new StringBuffer();
private ScanResult mScanResult;
public String getScanResult(){
//每次点击扫描之前清空上一次扫描结果
if(mStringBuffer!=null){
mStringBuffer=new StringBuffer();
}
//开始扫描调用11的方法
scan();
listResult=mWifiManager.getScanResults();
if(listResult!=null){
for(int i=0;i<listResult.size();i++){
mScanResult=listResult.get(i);
//将需要的属性连接到字符串里面
mStringBuffer.append("NO.").append(i+1).append(" :").append(mScanResult.SSID).append("->").append(mScanResult.BSSID).append("->").append(mScanResult.capabilities).append("->").append(mScanResult.frequency).append("->").append(mScanResult.level).append("->").append(mScanResult.describeContents()).append("\n\n");
}
}
return mStringBuffer.toString();
}
14.断开当前连接的网络
public void disconnectWifi(){
//获取网络ID
int newId=getNetworkId();
//设置网络不可用
mWifiManager.disableNetWork(netId);
//断开网络
mWifiManager.disconnect();
//设置Wi-Fi信息为NULL
mWifiInfo=null;
}
15.检查当前网络状态
public Boolean checkNetWorkState(){
if(mWifiInfo!=null){
return true;
}else{
return false;
}
}
16.得到连接的ID
public int getNetworkId(){
return (mWifiInfo==null)?0:mWifiInfo.getNetworkId();
}
17.得到IP地址
public void getIPAddress(){
return (mWifiInfo==null)?0:mWifiInfo.getIpAddress();
}
18.锁定WifiLock
WinfiLock mWifiLock;
public void acquireWifilock(){
mWifiLock.acquire();
}
19.解锁WifiLock
public void releaseWifiLock(){
if(mWifiLock.isHeld()){
mWifiLock.acquire();
}
}
20.创建一个WifiLock
public void creatWifiLock(){
mWifiLock=mWifiManager.createWifiLock("test");
}
21.得到配置好的网络wpa_supplicant.conf中的内容,不管有没有配置密码
public List<WifiConfiguration> getConfiguration(){
return wifiConfigList;
}
22.指定配置好的网络连接
public Boolean connectConfiguration(int index)(){
//所引大于配置好的网络返回
if(index>=wifiConfigList.size()){
return false;
}
return mWifiManager.enableNetwork(wifiConfigedSpecifiedList.get(index).networkId,true);
}
23.得到MAX地址
public String getMacAddress(){
return (mWifiInfo=null)?"":mWifiInfo.getMacAddress();
}
24.得到接入点BSSID
public String getBSSID(){
return (mWifiInfo=null)?"NULL":mWifiInfo.getBSSID();
}
25.得到WifiInfo的所有信息包
public String getWifiInfo(){
return (mWifiInfo=null)?"NULL":mWifiInfo.toString();
}
26.添加一个网络并连接
public int addNetwork(WifiConfiguration g){
//添加网络
int wcgID=mWifiManager.addNetwork(g);
//设置添加的网络可用
mWifiManager.enableNetwork(wcgID,true);
return wcgID;
}
Android Wi-Fi基本操作的更多相关文章
- Android 的 Sqlite基本操作
在 SQL 数据库中保存数据 使用数据库 将数据保存到数据库对于重复或结构化数据(比如契约信息)而言是理想之选. 本课程假定您基本熟悉 SQL 数据库并且可帮助您开始在 Android 中使用 SQL ...
- Android的SQLite基本操作
涉及SQLite的增删改查,结果用log显示 ? 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 ...
- Android WIFI的基本操作
WIFI管理类 class WifiConnector { private ExecutorService executors; Handler mHandler; WifiManager wifiM ...
- 【Android】 Android-wifi 直连 wifi direct wifi p2p
现在,Android的支持Wi -Fi的直接点对点点对点(P2P)Android系统的供电设备和其他类型的设备,没有一个热点或互联网连接之间的连接.Android框架提供了一套Wi - Fi的P2P的 ...
- 【转】获取android设备 id
关于本文档 Android的开发者在一些特定情况下都需要知道手机中的唯一设备ID.例如,跟踪应用程序的安装,生成用于复制保护的DRM时需要使用设备的唯一ID.在本文档结尾处提供了作为参考的示例代码片段 ...
- Android设备的ID
Android的开发者在一些特定情况下都需要知道手机中的唯一设备ID.例如,跟踪应用程序的安装,生成用于复制保护的DRM时需要使用设备的唯一ID.在本文档结尾处提供了作为参考的示例代码片段. 范围 本 ...
- 如何检索Android设备的唯一ID
关于本文档 Android的开发者在一些特定情况下都需要知道手机中的唯一设备ID.例如,跟踪应用程序的安装,生成用于复制保护的DRM时需要使用设备的唯一ID.在本文档结尾处提供了作为参考的示例代码片段 ...
- android intent收集转载汇总
Intent intent = new Intent(Settings.ACTION_WIRELESS_SETTINGS); ComponentName comp = ...
- Android 外部启动activity,自定义action,action常量大全
从任意app,启动另外一个app的activity: 1. Intent i = new Intent(); ComponentName cn = new ComponentN ...
- Android 如何检索Android设备的唯一ID
关于本文档 Android的开发者在一些特定情况下都需要知道手机中的唯一设备ID.例如,跟踪应用程序的安装,生成用于复制保护的DRM时需要使用设备的唯一ID.在本文档结尾处提供了作为参考的示例代码片段 ...
随机推荐
- Node.js:实现知乎(www.zhihu.com)模拟登陆,获取用户关注主题
前一段时间,在瞎看看 Node.js,便研究通过 Node.js 实现知乎模拟登陆.相信,有很多网站有登陆权限设置,如若用户未登陆,将会跳转至首页提醒用户登陆,无法浏览部分页面. 如若是 b/s 架构 ...
- hibernate AOP
摘自:http://pandonix.iteye.com/blog/336873/ 此前对于AOP的使用仅限于声明式事务,除此之外在实际开发中也没有遇到过与之相关的问题.最近项目中遇到了以下几点需求, ...
- Cygwin解决Windows远程登录linux服务器
下载地址http://www.cygwin.com/install.html 选择mirror.htnshost.com网站下载的比较快. 安装Cygwin(/X)需要选择的包: openssh(必选 ...
- hdu 4494 Teamwork 最小费用最大流
Teamwork Time Limit: 20 Sec Memory Limit: 256 MB 题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=4494 ...
- hdu 5279 Reflect phi 欧拉函数
Reflect Time Limit: 1 Sec Memory Limit: 256 MB 题目连接 http://bestcoder.hdu.edu.cn/contests/contest_chi ...
- 怎样配置Tomcat环境变量
JDK环境变量配置: 假设你的安装JDK在C盘里,如:C:\Program Files\Java\jdk1.6.0_05,那么就在系统变量里(当然也能够在用户变量里)点新建: 变量 ...
- Python的包管理工具Pip
接触了Ruby,发现它有个包管理工具RubyGem非常好用,而且有非常完备的文档系统http://rdoc.info 发现Python下也有相同的工具,包含easy_install和Pip.只是,我没 ...
- 免费的天气预报API--谷歌,雅虎,中央气象台
Google Weather API 仅仅支持美国地区使用邮政编码进行查询,比如: http://www.google.com/ig/api?hl=zh-cn&weather=94043 ...
- Hadoop发展历史简介
简介 本篇文章主要介绍了Hadoop系统的发展历史以及商业化现状, 科普文. 如果你喜欢本博客,请点此查看本博客所有文章:http://www.cnblogs.com/xuanku/p/index.h ...
- 文件I/O(不带缓冲)之文件共享
UNIX系统支持在不同进程间共享打开的文件. 内核使用三种数据结构表示打开的文件,它们之间的关系决定了在文件共享方面一个进程对另一个进程可能产生的影响. (1)每个进程在进程表中都有一个记录项,记录项 ...