我是靠谱客的博主 矮小宝贝,最近开发中收集的这篇文章主要介绍android.net.wifi的简单使用方法,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述


        
string 网络 路由器 service 手机

 获取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类型。

[java] view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1.   private String intToString(int a){  
  2.     StringBuffer sb=new StringBuffer();  
  3.     int b=(a>>0)&0xff;  
  4.     sb.append(b+".");  
  5.     b=(a>>8)&0xff;  
  6.     sb.append(b+".");  
  7.     b=(a>>16)&0xff;  
  8.     sb.append(b+".");  
  9.     b=(a>>24)&0xff;  
  10.     sb.append(b);  
  11. return sb.toString();  
  12.   }  
    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 。 




[java] view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. //判断WIFI是否连接  
//判断WIFI是否连接
[java] view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. private boolean isConnected(Context context){  
  2.     ConnectivityManager cm = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);  
  3.     NetworkInfo ni = cm.getNetworkInfo(ConnectivityManager.TYPE_WIFI);  
  4.     System.out.println(ni.getState());  
  5.     System.out.println(ni.getDetailedState()+"-----");  
  6.     if(ni != null && ni.getState()==State.CONNECTED)  
  7.         return true;  
  8.     return false;  
  9. }  
	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;
	}

[java] view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. private boolean isWifiConected(Context context) {  
  2.     WifiManager wm = (WifiManager) context  
  3.             .getSystemService(Context.WIFI_SERVICE);  
  4.     List<WifiConfiguration> list = wm.getConfiguredNetworks();  
  5.     Iterator<WifiConfiguration> it = list.iterator();  
  6.     while (it.hasNext()) {  
  7.         WifiConfiguration wc = it.next();  
  8.         if (wc.status == WifiConfiguration.Status.CURRENT)  
  9.             return true;  
  10.     }  
  11.     return false;  
  12. }//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可能为空。


[java] view plain copy print ? 在CODE上查看代码片 派生到我的代码片
  1. public String getMac() {  
  2.     WifiManager wm = (WifiManager) getSystemService(WIFI_SERVICE);  
  3.     WifiInfo wi = wm.getConnectionInfo();  
  4.     if(wi == null)  
  5.         return null;  
  6.     return wi.getMacAddress();  
  7. }  

最后

以上就是矮小宝贝为你收集整理的android.net.wifi的简单使用方法的全部内容,希望文章能够帮你解决android.net.wifi的简单使用方法所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(36)

评论列表共有 0 条评论

立即
投稿
返回
顶部