作者:李灏
一、什么是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)
对无线网络的监管其实还是有挺大用处的。比如一个需要和网络大量交互的程序,在运行之前可以先判断一下无线网卡的状态,然后对用户进行提醒操作。