在Android中对Wifi操作,android本身提供了一些有用的包,在android.net.wifi包下面。主要包括以下几个类和接口:
1.ScanResult
主要用来描述已经检测出的接入点,包括接入点的地址,接入点的名称,身份认证,频率,信号强度等信息。
2.WifiConfiguration
Wifi网络的配置,包括安全设置等。
3.WifiInfo
wifi无线连接的描述,包括接入点,网络连接状态,隐藏的接入点,IP地址,连接速度,MAC地址,网络ID,信号强度等信息。这里简单介绍一下这里的方法:
getBSSID() 获取BSSID
getDetailedStateOf() 获取客户端的连通性
getHiddenSSID() 获得SSID 是否被隐藏
getIpAddress() 获取IP 地址
getLinkSpeed() 获得连接的速度
getMacAddress() 获得Mac 地址
getRssi() 获得802.11n 网络的信号
getSSID() 获得SSID
getSupplicanState() 返回具体客户端状态的信息
4.WifiManager
这个不用说,就是用来管理我们的wifi 连接,这里已经定义好了一些类,可以供我们使用。
获取WIFI网卡的状态
WIFI网卡的状态是由一系列的整形常量来表示的。
1.WIFI_STATE_DISABLED : WIFI网卡不可用(1)
2.WIFI_STATE_DISABLING : WIFI网卡正在关闭(0)
3.WIFI_STATE_ENABLED : WIFI网卡可用(3)
4.WIFI_STATE_ENABLING : WIFI网正在打开(2) (WIFI启动需要一段时间)
5.WIFI_STATE_UNKNOWN : 未知网卡状态
下面先写一个wifi的实例:
点击打开wifi: 状态为3-WIFI网卡可用 扫描到网络
首先看以下main.xml:
1 |
<div><?xml version= "1.0" encoding= "utf-8" ?> |
2 |
<ScrollView xmlns:android= "http://schemas.android.com/apk/res/android" |
3 |
android:layout_width= "fill_parent" |
4 |
android:layout_height= "fill_parent" |
5 |
> |
6 |
7 |
<LinearLayout |
8 |
android:orientation= "vertical" |
9 |
android:layout_width= "fill_parent" |
10 |
android:layout_height= "fill_parent" |
11 |
> |
12 |
<Button |
13 |
android:id= "@+id/scan" |
14 |
android:layout_width= "wrap_content" |
15 |
android:layout_height= "wrap_content" |
16 |
android:text= "扫描网络" |
17 |
/> |
18 |
<Button |
19 |
android:id= "@+id/start" |
20 |
android:layout_width= "wrap_content" |
21 |
android:layout_height= "wrap_content" |
22 |
android:text= "打开Wifi" |
23 |
/> |
24 |
<Button |
25 |
android:id= "@+id/stop" |
26 |
android:layout_width= "wrap_content" |
27 |
android:layout_height= "wrap_content" |
28 |
android:text= "关闭Wifi" |
29 |
/> |
30 |
<Button |
31 |
android:id= "@+id/check" |
32 |
android:layout_width= "wrap_content" |
33 |
android:layout_height= "wrap_content" |
34 |
android:text= "Wifi状态" |
35 |
/> |
36 |
<TextView |
37 |
android:id= "@+id/allNetWork" |
38 |
android:layout_width= "fill_parent" |
39 |
android:layout_height= "wrap_content" |
40 |
android:text= "当前没有扫描到Wifi网络" |
41 |
/> |
42 |
</LinearLayout> |
43 |
</ScrollView></div> |
44 |
<div> |
接下来我们吧wifi的相关操作都封装在了一个WifiAdmin类中,以后开启或关闭等相关操作可以直接调用这个类的相关方法:
1 |
</div> |
2 |
</div> |
3 |
<div>import java.util.List; |
4 |
5 |
import android.content.Context; |
6 |
import android.net.wifi.ScanResult; |
7 |
import android.net.wifi.WifiConfiguration; |
8 |
import android.net.wifi.WifiInfo; |
9 |
import android.net.wifi.WifiManager; |
10 |
import android.net.wifi.WifiManager.WifiLock; |
11 |
12 |
public class WifiAdmin { |
13 |
//定义一个WifiManager对象 |
14 |
private WifiManager mWifiManager; |
15 |
//定义一个WifiInfo对象 |
16 |
private WifiInfo mWifiInfo; |
17 |
//扫描出的网络连接列表 |
18 |
private List<ScanResult> mWifiList; |
19 |
//网络连接列表 |
20 |
private List<WifiConfiguration> mWifiConfigurations; |
21 |
WifiLock mWifiLock; |
22 |
public WifiAdmin(Context context){ |
23 |
//取得WifiManager对象 |
24 |
mWifiManager=(WifiManager) context.getSystemService(Context.WIFI_SERVICE); |
25 |
//取得WifiInfo对象 |
26 |
mWifiInfo=mWifiManager.getConnectionInfo(); |
27 |
} |
28 |
//打开wifi |
29 |
public void openWifi(){ |
30 |
if (!mWifiManager.isWifiEnabled()){ |
31 |
mWifiManager.setWifiEnabled(true); |
32 |
} |
33 |
} |
34 |
//关闭wifi |
35 |
public void closeWifi(){ |
36 |
if (mWifiManager.isWifiEnabled()){ |
37 |
mWifiManager.setWifiEnabled(false); |
38 |
} |
39 |
} |
40 |
// 检查当前wifi状态 |
41 |
public int checkState() { |
42 |
return mWifiManager.getWifiState(); |
43 |
} |
44 |
//锁定wifiLock |
45 |
public void acquireWifiLock(){ |
46 |
mWifiLock.acquire(); |
47 |
} |
48 |
//解锁wifiLock |
49 |
public void releaseWifiLock(){ |
50 |
//判断是否锁定 |
51 |
if (mWifiLock.isHeld()){ |
52 |
mWifiLock.acquire(); |
53 |
} |
54 |
} |
55 |
//创建一个wifiLock |
56 |
public void createWifiLock(){ |
57 |
mWifiLock=mWifiManager.createWifiLock( "test" ); |
58 |
} |
59 |
//得到配置好的网络 |
60 |
public List<WifiConfiguration> getConfiguration(){ |
61 |
return mWifiConfigurations; |
62 |
} |
63 |
//指定配置好的网络进行连接 |
64 |
public void connetionConfiguration(int index){ |
65 |
if (index>mWifiConfigurations.size()){ |
66 |
return ; |
67 |
} |
68 |
//连接配置好指定ID的网络 |
69 |
mWifiManager.enableNetwork(mWifiConfigurations.get(index).networkId, true); |
70 |
} |
71 |
public void startScan(){ |
72 |
mWifiManager.startScan(); |
73 |
//得到扫描结果 |
74 |
mWifiList=mWifiManager.getScanResults(); |
75 |
//得到配置好的网络连接 |
76 |
mWifiConfigurations=mWifiManager.getConfiguredNetworks(); |
77 |
} |
78 |
//得到网络列表 |
79 |
public List<ScanResult> getWifiList(){ |
80 |
return mWifiList; |
81 |
} |
82 |
//查看扫描结果 |
83 |
public StringBuffer lookUpScan(){ |
84 |
StringBuffer sb= new StringBuffer(); |
85 |
for (int i=0;i<mWifiList.size();i++){ |
86 |
sb.append( "Index_" + new Integer(i + 1).toString() + ":" ); |
87 |
// 将ScanResult信息转换成一个字符串包 |
88 |
// 其中把包括:BSSID、SSID、capabilities、frequency、level |
89 |
sb.append((mWifiList.get(i)).toString()).append( "\n" ); |
90 |
} |
91 |
return sb; |
92 |
} |
93 |
public String getMacAddress(){ |
94 |
return (mWifiInfo==null)? "NULL" :mWifiInfo.getMacAddress(); |
95 |
} |
96 |
public String getBSSID(){ |
97 |
return (mWifiInfo==null)? "NULL" :mWifiInfo.getBSSID(); |
98 |
} |
99 |
public int getIpAddress(){ |
100 |
return (mWifiInfo==null)?0:mWifiInfo.getIpAddress(); |
101 |
} |
102 |
//得到连接的ID |
103 |
public int getNetWordId(){ |
104 |
return (mWifiInfo==null)?0:mWifiInfo.getNetworkId(); |
105 |
} |
106 |
//得到wifiInfo的所有信息 |
107 |
public String getWifiInfo(){ |
108 |
return (mWifiInfo==null)? "NULL" :mWifiInfo.toString(); |
109 |
} |
110 |
//添加一个网络并连接 |
111 |
public void addNetWork(WifiConfiguration configuration){ |
112 |
int wcgId=mWifiManager.addNetwork(configuration); |
113 |
mWifiManager.enableNetwork(wcgId, true); |
114 |
} |
115 |
//断开指定ID的网络 |
116 |
public void disConnectionWifi(int netId){ |
117 |
mWifiManager.disableNetwork(netId); |
118 |
mWifiManager.disconnect(); |
119 |
} |
120 |
}</div> |
121 |
<div> |
最后看以下WifiActivity类:
1 |
</div> |
2 |
</div> |
3 |
<div>import java.util.List; |
4 |
5 |
import android.app.Activity; |
6 |
import android.net.wifi.ScanResult; |
7 |
import android.os.Bundle; |
8 |
import android.view.View; |
9 |
import android.view.View.OnClickListener; |
10 |
import android.widget.Button; |
11 |
import android.widget.TextView; |
12 |
import android.widget.Toast; |
13 |
14 |
public class WifiActivity extends Activity { |
15 |
/** Called when the activity is first created. */ |
16 |
private TextView allNetWork; |
17 |
private Button scan; |
18 |
private Button start; |
19 |
private Button stop; |
20 |
private Button check; |
21 |
private WifiAdmin mWifiAdmin; |
22 |
// 扫描结果列表 |
23 |
private List<ScanResult> list; |
24 |
private ScanResult mScanResult; |
25 |
private StringBuffer sb= new StringBuffer(); |
26 |
@Override |
27 |
public void onCreate(Bundle savedInstanceState) { |
28 |
super.onCreate(savedInstanceState); |
29 |
setContentView(R.layout.main); |
30 |
mWifiAdmin = new WifiAdmin(WifiActivity.this); |
31 |
init(); |
32 |
} |
33 |
public void init(){ |
34 |
allNetWork = (TextView) findViewById(R.id.allNetWork); |
35 |
scan = (Button) findViewById(R.id.scan); |
36 |
start = (Button) findViewById(R.id.start); |
37 |
stop = (Button) findViewById(R.id.stop); |
38 |
check = (Button) findViewById(R.id.check); |
39 |
scan.setOnClickListener( new MyListener()); |
40 |
start.setOnClickListener( new MyListener()); |
41 |
stop.setOnClickListener( new MyListener()); |
42 |
check.setOnClickListener( new MyListener()); |
43 |
} |
44 |
private class MyListener implements OnClickListener{ |
45 |
46 |
@Override |
47 |
public void onClick(View v) { |
48 |
// TODO Auto-generated method stub |
49 |
switch (v.getId()) { |
50 |
case R.id.scan: //扫描网络 |
51 |
getAllNetWorkList(); |
52 |
break ; |
53 |
case R.id.start: //打开Wifi |
54 |
mWifiAdmin.openWifi(); |
55 |
Toast.makeText(WifiActivity.this, "当前wifi状态为:" +mWifiAdmin.checkState(), 1).show(); |
56 |
break ; |
57 |
case R.id.stop: //关闭Wifi |
58 |
mWifiAdmin.closeWifi(); |
59 |
Toast.makeText(WifiActivity.this, "当前wifi状态为:" +mWifiAdmin.checkState(), 1).show(); |
60 |
break ; |
61 |
case R.id.check: //Wifi状态 |
62 |
Toast.makeText(WifiActivity.this, "当前wifi状态为:" +mWifiAdmin.checkState(), 1).show(); |
63 |
break ; |
64 |
default : |
65 |
break ; |
66 |
} |
67 |
} |
68 |
69 |
} |
70 |
public void getAllNetWorkList(){ |
71 |
// 每次点击扫描之前清空上一次的扫描结果 |
72 |
if (sb!=null){ |
73 |
sb= new StringBuffer(); |
74 |
} |
75 |
//开始扫描网络 |
76 |
mWifiAdmin.startScan(); |
77 |
list=mWifiAdmin.getWifiList(); |
78 |
if (list!=null){ |
79 |
for (int i=0;i<list.size();i++){ |
80 |
//得到扫描结果 |
81 |
mScanResult=list.get(i); |
82 |
sb=sb.append(mScanResult.BSSID+ " " ).append(mScanResult.SSID+ " " ) |
83 |
.append(mScanResult.capabilities+ " " ).append(mScanResult.frequency+ " " ) |
84 |
.append(mScanResult.level+ "\n\n" ); |
85 |
} |
86 |
allNetWork.setText( "扫描到的wifi网络:\n" +sb.toString()); |
87 |
} |
88 |
} |
89 |
}</div> |
90 |
<div> |
不要忘了加入权限:
1 |
<!-- 以下是使用wifi访问网络所需的权限 --> |
2 |
<uses-permission android:name= "android.permission.CHANGE_NETWORK_STATE" ></uses-permission> |
3 |
<uses-permission android:name= "android.permission.CHANGE_WIFI_STATE" ></uses-permission> |
4 |
<uses-permission android:name= "android.permission.ACCESS_NETWORK_STATE" ></uses-permission> |
5 |
<uses-permission android:name= "android.permission.ACCESS_WIFI_STATE" ></uses-permission></div> |
6 |
<div> |
最后看以下演示效果:
这些就是扫描到的wifi,具体参数参见上面介绍。