Andriod wifi 基本操作
-
从用户角度看,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 wifiConfigList=new ArrayList();
//Wi-Fi配置列表
private List wifiConfigedSpecifiedList=new ArrayList();
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 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 listResult=new ArrayList();
public void scan(){
//开始扫描
mWifiManager.startScan();
//获取扫描结果
listResult=mWifiManager.getScanResults();
//扫描配置列表
wifiConfigList=mWifiManager.getConfiguredNetworks();
if(listResult!=null){
//当前存在无线网络
}else{
//当前区域没有无线网络
}
}
12.返回扫描结果
public List 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
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 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;
}
Andriod wifi 基本操作的更多相关文章
- Andriod WIFI驱动模块
一:什么是WIFI WIFI是一种无线连接技术,可用于手机.电脑.PDA等终端.WIFI技术产生的目的是改善基于IEEE802.11标准的无线网络产品之间的互通性,也就是说WIFI是基于802.11标 ...
- Android Wi-Fi基本操作
从用户角度看,Android Wi-Fi模块自下向上可以看为5层:硬件驱动程序,wpa_suppplicant,JNI,WiFi API,WifiSettings应用程序. 1.wpa_supplic ...
- 九、Android学习第八天——广播机制与WIFI网络操作(转)
(转自:http://wenku.baidu.com/view/af39b3164431b90d6c85c72f.html) 九.Android学习第八天——广播机制与WIFI网络操作 今天熟悉了An ...
- Android WIFI的基本操作
WIFI管理类 class WifiConnector { private ExecutorService executors; Handler mHandler; WifiManager wifiM ...
- Andriod小项目——在线音乐播放器
转载自: http://blog.csdn.net/sunkes/article/details/51189189 Andriod小项目——在线音乐播放器 Android在线音乐播放器 从大一开始就已 ...
- Fiddler基本原理与抓取Andriod与IOS的App数据包
Fiddler基本原理 Fiddler数据包的原理是Fiddler将自己设置为一个代理服务器,默认监听127.0.0.1:8888端口同时将浏览器的HTTP.HTTPS协议设置为使用代理服务器也就是使 ...
- Andriod环境搭建
安卓是一款现在在移动端十分流行的系统,本人出于好奇心,希望彻底了解安卓的开发技. 首先了解一下安卓的系统构架,安卓大致分为四层架构,五块区域: 1.Linux内核层 Andriod是基于Linux2. ...
- Windows 7/8 创建WIFI热点
问题描述:很多人(特别是中国的大学生)都拥有一台联网的笔记本电脑,而手机使用的却是电信运营商提供的限制数量和速度的GPRS. 很多人不敢想象:联网的笔记本电脑能够将其流量以WiFi的形式共享出来供其它 ...
- phonegap环境配置与基本操作
一.开发环境配置: 1.工具环境安装: 安装java sdk 1.6以上版本号,Android Development Tools.ant,系统变量 Path后面加入 新增名稱 JAVA_HOME 值 ...
随机推荐
- Ralink RT3290无线网卡驱动安装 (linux)
Ralink RT3290无线网卡驱动安装 (linux, 笔记备忘) 1. 设备信息查看无线网卡设备信息 # lspci : 2. 驱动下载http://pan.baidu.com/s/1sjsHN ...
- hdu 4612 Warm up 桥缩点
4612Warm hdu up 题目:给出一个图,添加一条边之后,问能够在新图中得到的最少的桥的数量. 分析:我们可以双联通分量进行缩点,原图变成了一棵树.问题变成了:求树中添加一条边之后,使得不在圈 ...
- echo,printr,print_r之间的区别
echo 返回值是void,可以一次输出多个值,多个值之间用逗号分隔.echo是语言结构(language construct)也就是关键字,而并不是真正的函数,因此不能作为表达式的一部分使用.使用的 ...
- JS内存泄露常见原因
详细内容请点击 分享的笔记本-前端 开发中,我们常遇见的一些关于js内存泄露的问题,有时候我们常常会找半天找不出原因,这里给大家介绍简单便捷的方法 1.闭包上下文绑定后没有释放: 2.观察者模式在 ...
- Abp Zero——前端如何新增功能模块
为适应不同开发人员,abp rezo的UI实现了spa和mpa两套: spa--Single-page Application(单页面应用),默认"http://localhost/Acco ...
- 在IIS上发布项目后浏览时报的错:Unable to make the session state request to the session state server
错误描述: Unable to make the session state request to the session state server. Please ensure that the A ...
- js中的相等与不等运算
如果其中一个操作数的类型为 Boolean ,那么,首先将它转换为数字类型,false 转换为 0, true 将转换为 1. 如果其中一个操作数的类型是字符串,另外一个为数字类型,那么,将字符串转换 ...
- 桌面虚拟化之XenDesktop7
安装篇 1. 安装所需要的组件 2. 安装核心组件 配置篇 完整的部署 1. 打开Citrix Studio软件 2. 选择完整部署 3. 创建站点 4. 选择数据库(可以使用自己的或者默认使用自带的 ...
- String中重要方法与字段
下列这段代码已全部包含了我要写的String类中重要的字段: //StringMisc.java// This program demonstrates the length, charAt and ...
- 洛谷 P3374 【模板】树状数组 1
题目描述 如题,已知一个数列,你需要进行下面两种操作: 1.将某一个数加上x 2.求出某区间每一个数的和 输入输出格式 输入格式: 第一行包含两个整数N.M,分别表示该数列数字的个数和操作的总个数. ...