android.net.wifi的简单使用方法
获取Wifi的控制类WifiManager。 WifiManager wm=(WifiManager)getSystemService(Context.WIFI_SERVICE); 接下来可以对wifi操作了,比如要打开、关闭wifi,可以通过WifiManager的setWifiEnabled()方法来开关wifi。 若要查看一些信息,可以通过getConnectionInfo()方法得到WifiInfo类的对象,WifiInfo类里主要提供手机wifi上面存储的连接信息。 WifiInfo类方法: 1、getBSSID() 获取接入点的mac地址(String) 2、getIpAddress() 获取本机的IP地址 (int) 3、getLinkSpeed() 获取连接速度(不是下载速度),单位为Mbps (int) 4、getMacAddress() 获取mac地址 (String) 5、getNetworkId() 获取网络id号。每一个设定好了的网络都有一个独一无二的整数型ID号,用来识别网络,当操作请求时(翻译)。简而言之,就是这个号就是代表一个连接点,手机可以通过wifi连接很多无线网的。 6、getRssi() 返回收到的信号强度,是个负数。(好像到-113就表示一点信号都没有,也就是说数越大信号就越好) 7、getSSID() 获取无线信号提供者的名称 (就是要连的网络的名字)(String) 上面那个类只能查到本机的mac地址与ip,要只查看本机的详细信息,可以通过这个类:DhcpInfo df=wm.getDhcpInfo(); DhcpInfo类没什么方法,提供了一些字段: 1、dns1 第一个DNS 2、dns2 如上 3、gateway 网关 4、ipAddress IP地址 5、netmask 子网掩码 6、serverAddress 服务端地址(其实就是路由器ip,和网关一样) 7、leaseDuration 和上面的getLinkSpeed() 方法的值接近,可能是连接速度,不过单位不是Mbps,getLinkSpeed() 得到72,这个字段的值是7200
上面的IP与网关、子网掩码等都是int型数值,直接看看不懂,附上一个我写的方法把int转成String类型。
- private String intToString(int a){
- StringBuffer sb=new StringBuffer();
- int b=(a>>0)&0xff;
- sb.append(b+".");
- b=(a>>8)&0xff;
- sb.append(b+".");
- b=(a>>16)&0xff;
- sb.append(b+".");
- b=(a>>24)&0xff;
- sb.append(b);
- return sb.toString();
- }
private String intToString(int a){
StringBuffer sb=new StringBuffer();
int b=(a>>0)&0xff;
sb.append(b+".");
b=(a>>8)&0xff;
sb.append(b+".");
b=(a>>16)&0xff;
sb.append(b+".");
b=(a>>24)&0xff;
sb.append(b);
return sb.toString();
}
WifiConfiguration 类主要提供一个wifi配置的所有信息 有如下字段(自己明白的不一定正确): BSSID 接入点的mac地址。 SSID 接入点的名字。 networkId 网络号 preSharedKey WPA-PSK密码,如果有就会得到一个*(这玩意就是判断是不是有密码的) priority 优先级
status 连接状态,值是WifiConfiguration.Status中字段的一种。
WifiConfiguration.Status 提供了3个字段表示wifi连接的三种状态 1.CURRENT 值为0,表示处于连接状态 2.DISABLED 值为1,表示网络不可用 3. ENABLED 值为2,表示网络可用但没连接
ScanResult wifi扫描到的接入点信息 1.BSSID 2.SSID 3.capabilities 4.frequency 5.level
关于接收WIFI状态改变接收广播信息:
ACTION: WifiManager.WIFI_STATE_CHANGED_ACTION ( "android.net.wifi.WIFI_STATE_CHANGED")wifi状态变化触发,触发两次。
可接收两个信息:(键) (这个是监听wifi状态变化的,wifi状态变化并不包括wifi的连接状态,只是单纯的指示wifi的5种状态)
1. WifiManager.EXTRA_PREVIOUS_WIFI_STATE("previous_wifi_state") int型值 intent.getIntExtra("键",0);(第二个为得不到时的默认值)
2. WifiManager.EXTRA_WIFI_STATE("wifi_state") int型值 intent.getIntExtra("键",0);(第二个为得不到时的默认值)
ACTION: WifiManager.NETWORK_STATE_CHANGED_ACTION("android.net.wifi.STATE_CHANGE")wifi连接网络的状态广播,连接过程中接收多次,在连接过程中可与获取NetworkInfo对象,通过ni.getState()可以获取wifi连接状态。如果连接state处于connected状态,可以通过WifiManager.EXTRA_WIFI_INFO得到wifiInfo对象。(不重要细节:测试时发现 下面isconnected()方法为true时,这个广播还处于connecting状态,再一次广播才变成connected)
可接收两个信息:(键)
1. WifiManager.EXTRA_BSSID("bssid") String类型值 intent.getStringExtra("键")
2. WifiManager.EXTRA_NETWORK_INFO("networkInfo") T getParcelableExtra(“键”)
ACTION: WifiManager.SUPPLICANT_CONNECTION_CHANGE_ACTION( "android.net.wifi.supplicant.CONNECTION_CHANGE") 判断是否WIFI打开了,变化触发一次
可接收一个信息:(键)(这个应该是广播wifi启动状态的,true表示连接到wifi设备,一般在wifi state处于enable时得到,false则表示断开设备连接,wifi此时状态为disabling。这只是指机器内的wifi连接状态变化,与网络无关)
1. WifiManager.EXTRA_SUPPLICANT_CONNECTED("connected") boolean类型返回值 intent.getBooleanExtra(“键”, true)第二个是默认值
ACTION: WifiManager.SUPPLICANT_STATE_CHANGED_ACTION("android.net.wifi.supplicant.STATE_CHANGE")发送WIFI连接的过程信息,如果出错ERROR信息才会收到。连接WIFI时触发,触发多次。
可接收两个信息:(键)
1. WifiManager.EXTRA_NEW_STATE("newState") intent.getParcelableExtra("键")
2. WifiManager.EXTRA_SUPPLICANT_ERROR("supplicantError") int型值 getIntExtra(“键”, int)
WIFI状态int值对应的状态:
WifiManager.WIFI_STATE_DISABLED ==1
WifiManager.WIFI_STATE_DISABLING ==0
WifiManager. WIFI_STATE_ENABLED==3
WifiManager. WIFI_STATE_ENABLING==2
WifiManager. WIFI_STATE_UNKNOWN==4
上面的是在有wifi的环境下测的,没在没WIFI的环境下测,不一定准,但差不多了。测试机型HTC G17。
如果在连接WIFI的过程中(Connecting),去连接网络地址(比如http://www.baidu.com)会得到找不到地址的异常,并且在8秒左右之内(就测了一台定制机),不能连接这一地址,否则报找不到地址异常。
这个包并不判断网络连接状态,只是判断wifi的各种状态,如果需要判断网络状态, 在android.net包中。ConnectivityManager 。
- //判断WIFI是否连接
//判断WIFI是否连接
- private boolean isConnected(Context context){
- ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
- NetworkInfo ni = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
- System.out.println(ni.getState());
- System.out.println(ni.getDetailedState()+"-----");
- if(ni != null && ni.getState()==State.CONNECTED)
- return true;
- return false;
- }
private boolean isConnected(Context context){
ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo ni = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);
System.out.println(ni.getState());
System.out.println(ni.getDetailedState()+"-----");
if(ni != null && ni.getState()==State.CONNECTED)
return true;
return false;
}
- private boolean isWifiConected(Context context) {
- WifiManager wm = (WifiManager) context
- .getSystemService(Context.WIFI_SERVICE);
- List<WifiConfiguration> list = wm.getConfiguredNetworks();
- Iterator<WifiConfiguration> it = list.iterator();
- while (it.hasNext()) {
- WifiConfiguration wc = it.next();
- if (wc.status == WifiConfiguration.Status.CURRENT)
- return true;
- }
- return false;
- }//2012.11.12在4.0机器上发现这个方法一直返回false,估计我理解错了,不要用。
private boolean isWifiConected(Context context) {
WifiManager wm = (WifiManager) context
.getSystemService(Context.WIFI_SERVICE);
List<WifiConfiguration> list = wm.getConfiguredNetworks();
Iterator<WifiConfiguration> it = list.iterator();
while (it.hasNext()) {
WifiConfiguration wc = it.next();
if (wc.status == WifiConfiguration.Status.CURRENT)
return true;
}
return false;
}//2012.11.12在4.0机器上发现这个方法一直返回false,估计我理解错了,不要用。
WifiInfo不为空并不代表这个类里面就存了信息,getMacAdress可能为空。
- public String getMac() {
- WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE);
- WifiInfo wi = wm.getConnectionInfo();
- if(wi == null)
- return null;
- return wi.getMacAddress();
- }
android.net.wifi的简单使用方法的更多相关文章
- Android 获取WIFI MAC地址的方法
1. 经常用法,调用Android的API:WifiManager <uses-permission android:name="android.permission.ACCESS_W ...
- 【腾讯优测干货分享】Android内存泄漏的简单检查与分析方法
本文来自于Dev Club 开发者社区,非经作者同意,请勿转载,原文地址:http://dev.qq.com/topic/57d14047603a5bf1242ad01b 导语 内存泄漏问题大约是An ...
- Android 使用剪贴板传递简单数据及复杂数据的方法
传递数据的场景在于不同页面之间跳转,需要携带数据:简单数据值指的是String, int等数据, 复杂数据指的是类 1. 使用剪贴板传递简单数据方法: 第一个页面里面放数据操作如下: Clipbo ...
- 修改android的wifi客户端名称的两种方法
修改android的wifi客户端名称的两种方法 手机连接到无线路由时,在dhcp的客户端列表里面是这样的名称"android-89425253e5de3a2",这就是安卓 ...
- Android 6.0 最简单的权限获取方法 RxPermition EasyPermition
Android 6.0 要单独的获取权限 这里提供两种很简单的方法 EasyPermition RxPermition EasyPermition https://github.com/googles ...
- 【Android】wifi开发
WIFI就是一种无线联网技术,常见的是使用无线路由器.那么在这个无线路由器的信号覆盖的范围内都可以采用WIFI连接的方式进行联网.如果无线路由器连接了一个ADSL线路或其他的联网线路,则又被称为“热点 ...
- 【移动开发】Android中WIFI开发总结(二)
搞了好几天终于有点眉目了,这里接着总结一下Android中WiFi的使用,在前面(http://smallwoniu.blog.51cto.com/3911954/1334951)我们已经简单了解了W ...
- 【移动开发】Android中WIFI开发总结(一)
WIFI就是一种无线联网技术,常见的是使用无线路由器.那么在这个无线路由器的信号覆盖的范围内都可以采用WIFI连接的方式进行联网.如果无线路由器连接了一个ADSL线路或其他的联网线路,则又被称为“热 ...
- android之wifi开发
WIFI就是一种无线联网技术,常见的是使用无线路由器.那么在这个无线路由器的信号覆盖的范围内都可以采用WIFI连接的方式进行联网.如果无线路由器连接了一个ADSL线路或其他的联网线路,则又被称为“热点 ...
随机推荐
- 单机最大tcp连接数
from:http://www.cnblogs.com/mydomain/archive/2013/05/27/3100835.html 单机最大tcp连接数 网络编程 在tcp应用中,server事 ...
- 纯CSS3制作九款可爱复古相机
前言 掐指一算,快两个月没写博客分享了.好吧,我就只是在准备校招而已.现在已经有满意的offer了,所以我就回来啦!这两个月过得挺煎熬也挺充实的.具体细说估计得长篇大论,我就不闲扯了.总之呢,越努力, ...
- msg url
- VBS基础篇 - 过程(sub 与 Function)
VBS基础篇 - 过程(sub 与 Function) 在VBscript中,有两种procedure:Sub procedure与Function procedure Sub过程:是包含在 Sub ...
- 如何使用Native Messaging API 打开window程序
问 如何使用Native Messaging API 打开window程序 cmd javascript terminal chrome Tychio 2013年03月26日提问 关注 1 关注 收藏 ...
- ios 定位 监听是否跨入某个指定的区域
/*****监听用户是否进入和走出 在某个区域*****/ 1 #import "ViewController.h" #import <CoreLocation/CoreLo ...
- Linux常用指令---定时任务
linux定时任务crontab命令选项基本只有对用户操作选项:-u 指定用户-l 列出某用户任务计划-r 删除某用户任务-e 编辑某用户任务 查看某一用户的定时任务crontab -u root - ...
- Activiti系列: 如何在web中使用activiti和sql server
最近要开始使用activiti结合原有的系统来开发一个专业领域内的业务管理软件,以下记录了第一次搭建该开发平台过程中所遇到的各种问题,备忘. 一.按照如下方式新建一个web工程 之所以要用 ...
- iOS如何上传代码到Github
iOS如何上传代码到Github 很多iOS开发者想开源自己的代码或者demo,开源到Github是个不错的选择,那么如何上传我们的代码到Github,令所有人可以下载使用呢?这里我们的目的很明确,就 ...
- Opencv step by step - 阈值化
Opencv里面的阈值化做起来比较简单,只需要一个函数即可: /* Applies fixed-level threshold to grayscale image. This is a basic ...