作者:李灏
一、什么是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中添加获取无线网卡状态所需要的权限:
<uses-permission android:name="android.permission.CHANGE_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.CHANGE_WIFI_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"></uses-permission>
<uses-permission android:name="android.permission.ACCESS_WIFI_STATE"></uses-permission>
此实验需要在真机条件下运行,因为模拟器没有办法模拟出无线网卡。如果在模拟器下启动无线网卡之后,无线网卡的状态会被置为4,也就是未知网卡状态(WIFI_STATE_UNKNOWN)。而且在模拟器下运行的时候还需要加一条权限:
<uses-permission android:name="android.permission.WAKE_LOCK"></uses-permission>
具体原因也不知道为什么,运行代码后android日志里面说需要添加这个权限。
主程序中的代码如下:
package com.wifi;
import android.app.Activity;
import android.content.Context;
import android.net.wifi.WifiManager;
import android.os.Bundle;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class WIFITestActivity extends Activity {
/** Called when the activity is first created. */
private Button startButton = null;
private Button stopButton = null;
private Button checkButton = null;
private WifiManager wifiManager = null;
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.main);
startButton = (Button)this.findViewById(R.id.startButton);
stopButton = (Button)this.findViewById(R.id.stopButton);
checkButton = (Button)this.findViewById(R.id.checkButton);
startButton.setOnClickListener(new StartListener());
stopButton.setOnClickListener(new StopListener());
checkButton.setOnClickListener(new CheckListener());
}
class StartListener implements OnClickListener{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
wifiManager = (WifiManager)WIFITestActivity.this.getSystemService(Context.WIFI_SERVICE);
wifiManager.setWifiEnabled(true);
System.out.println("当前的网卡状态为:" + wifiManager.getWifiState());
}
}
class StopListener implements OnClickListener{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
wifiManager = (WifiManager)WIFITestActivity.this.getSystemService(Context.WIFI_SERVICE);
wifiManager.setWifiEnabled(false);
System.out.println("当前的网卡状态为:" + wifiManager.getWifiState());
}
}
class CheckListener implements OnClickListener{
@Override
public void onClick(View v) {
// TODO Auto-generated method stub
wifiManager = (WifiManager)WIFITestActivity.this.getSystemService(Context.WIFI_SERVICE);
System.out.println("当前的网卡状态为:" + wifiManager.getWifiState());
}
}
}
六、运行结果及总结
事件 输出状态
按下start 2(WIFI_STATE_ENABLING)
按下check 3(WIFI_STATE_ENABLED)
按下stop 0(WIFI_STATE_DISABLING)
按下check 1(WIFI_STATE_DISABLED)
对无线网络的监管其实还是有挺大用处的。比如一个需要和网络大量交互的程序,在运行之前可以先判断一下无线网卡的状态,然后对用户进行提醒操作。