Android之WiFi開發應用示例
摘要: 在Android中對Wifi操作,android本身提供了一些有用的包,在android.net.wifi包下面。主要包括以下幾個類和接口: 1.ScanResult 主要用來描述已經檢測出的接入點,包括接入點的地址,接入點的名稱,身份認證,頻率,信號強度等信息。
在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,具體參數參見上面介紹。