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