作者:李灏

一、什么是wifi

wifi是一种无线联网的技术,以前通过网线链接电脑,现在则是通过无线电波来链接网络。常见的发送无线电波的工具是无线路由器,无线路由器的电波覆盖的有效范围都可以采用wifi方式上网。如果wifi链接了asdl上网线路,则又被称作“热点”。


二、wifi网卡的状态

WIFI网卡的状态是由一系列的整形常量来表示的。

WIFI_STATE_DISABLED  1     WIFI无线网卡不可用

WIFI_STATE_DISABLING 0   WIFI正在关闭

WIFI_STATE_ENABLED   3   WIFI可用

WIFI_STATE_ENABLING  2   WIFI正在打开

WIFI_STATE_UNKNOWN   4   未知网卡状态


三、操作WIFI网卡所需要的权限

关于操作权限可以在帮助文档当中找到完整的列表,在这里列出和网络部分相关的权限。

CHANGE_NETWORK_STATE

CHANGE_WIFI_STATE

ACCESS_NETWORK_STATE

ACCESS_WIFI_STATE

英语字面上的意思已经能够解释了这四个变量的具体含义。


四、修改WIFI网卡的状态

对WIFI网卡进行操作需要通过WIFIManager对象进行,获取该对象的方法如下:

wifiManager =(WifiManager)Context.getSystemService(Service.WIFI_SERVICE);

getSystemService是获取当前环境的系统服务。同理可以用此方法来获取其他系统服务。

打开无线网卡:

wifiManager.setWifiEnabled(true);

关闭无线网卡:

wifiManager.setWifiEnabled(false);

获取无线网卡状态:

wifiManager.getWifiState()


五、示例代码

首先需要在AndroidManifest.xml中添加获取无线网卡状态所需要的权限:



[html] view plaincopy


1. <uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"></uses-permission>  
2. <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>  
3. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>  
4. <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>




此实验需要在真机条件下运行,因为模拟器没有办法模拟出无线网卡。如果在模拟器下启动无线网卡之后,无线网卡的状态会被置为4,也就是未知网卡状态(WIFI_STATE_UNKNOWN)。而且在模拟器下运行的时候还需要加一条权限:





[html] view plaincopy




1. <uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>

具体原因也不知道为什么,运行代码后android日志里面说需要添加这个权限。

主程序中的代码如下:





[java] view plaincopy


1. package com.wifi;  
2.   
3. import android.app.Activity;  
4. import android.content.Context;  
5. import android.net.wifi.WifiManager;  
6. import android.os.Bundle;  
7. import android.view.View;  
8. import android.view.View.OnClickListener;  
9. import android.widget.Button;  
10.   
11. public class WIFITestActivity extends Activity {  
12. /** Called when the activity is first created. */  
13. private Button startButton = null;  
14. private Button stopButton = null;  
15. private Button checkButton = null;  
16. private WifiManager wifiManager = null;  
17. @Override  
18. public void onCreate(Bundle savedInstanceState) {  
19. super.onCreate(savedInstanceState);  
20.         setContentView(R.layout.main);  
21.           
22. this.findViewById(R.id.startButton);  
23. this.findViewById(R.id.stopButton);  
24. this.findViewById(R.id.checkButton);  
25. new StartListener());  
26. new StopListener());  
27. new CheckListener());  
28.     }  
29. class StartListener implements OnClickListener{  
30.   
31. @Override  
32. public void onClick(View v) {  
33. // TODO Auto-generated method stub  
34. this.getSystemService(Context.WIFI_SERVICE);  
35. true);  
36. "当前的网卡状态为:" + wifiManager.getWifiState());  
37.         }         
38.     }  
39. class StopListener implements OnClickListener{  
40.   
41. @Override  
42. public void onClick(View v) {  
43. // TODO Auto-generated method stub  
44. this.getSystemService(Context.WIFI_SERVICE);  
45. false);  
46. "当前的网卡状态为:" + wifiManager.getWifiState());  
47.         }         
48.     }  
49. class CheckListener implements OnClickListener{  
50.   
51. @Override  
52. public void onClick(View v) {  
53. // TODO Auto-generated method stub  
54. this.getSystemService(Context.WIFI_SERVICE);  
55. "当前的网卡状态为:" + wifiManager.getWifiState());  
56.         }         
57.     }  
58.              
59. }





六、运行结果及总结


事件            输出状态

按下start       2(WIFI_STATE_ENABLING)

按下check       3(WIFI_STATE_ENABLED)

按下stop        0(WIFI_STATE_DISABLING)

按下check       1(WIFI_STATE_DISABLED)

对无线网络的监管其实还是有挺大用处的。比如一个需要和网络大量交互的程序,在运行之前可以先判断一下无线网卡的状态,然后对用户进行提醒操作。