編輯:關於Android編程
在android中。 管理wifi的管理器就是 WifiManager了。所以直接從
WifiManager說起。
1.WifiManager
context.getSystemService(Context.WIFI_SERVICE)//得到 WifiManager
setWifiEnabled(true) //打開wifi
setWifiEnabled(false) //關閉wifi
isWifiEnabled() //wifi是否可用
getWifiState() //得到wifi狀態
getConfiguredNetworks() //得到配置好的wifi配置
getConnectionInfo() 得到鏈接的wifi信息(WifiInfo)
startScan(); //WifiManager開始掃描方法
getScanResults() //得到掃描周圍wifi結果(List)
addNetwork(config) //添加網絡配置 下面會說明參數
enableNetwork(int netID ,boolean b) // 指定鏈接哪個網絡
disableNetwork(int netId) //指定斷開哪個網絡
calculateSignalLevel(int rssi,int numLevels)// 計算信號的等級
removeNetwork() //移除某一個網絡
getDhcpInfo() //獲取DHCP 的信息
calculateSignalLevel(int rssi,int numLevels)//計算信號的等級
compareSignalLevel(int rssiA,int rssiB)//對比連接A 和連接B
updateNetwork(WifiConfiguration config) //更新一個網絡連接的信息
上面 getScanResults 後得到的大致信息,掃描得到的相關附近wifi信息
SSID: mima0000, BSSID: b0:05:94:fa:93:64, capabilities: [WPA2-PSK-CCMP][ESS], level: -65, frequency: 2462
SSID: ChinaNet-unyU, BSSID:7c:60:97:03:8a:94, capabilities: [WPA-PSK-TKIP][ESS], level: -76, frequency: 2412
SSID 網絡的名字,當我們搜索一個網絡時,就是靠這個來區分每個不同的網絡接入點。
Capabilities 網絡接入的性能,這裡主要是來判斷網絡的加密方式等。
Frequency 頻率,每一個頻道交互的MHz 數。
Level 等級,主要來判斷網絡連接的優先數。
連接網絡 wifiConfiguration
WifiConfiguration.AuthAlgorthm 用來判斷加密方法。
WifiConfiguration.GroupCipher 獲取使用GroupCipher 的方法來進行加密。
WifiConfiguration.KeyMgmt 獲取使用KeyMgmt 進行。
WifiConfiguration.PairwiseCipher 獲取使用WPA 方式的加密。
WifiConfiguration.Protocol 獲取使用哪一種協議進行加密。
wifiConfiguration.Status 獲取當前網絡的狀態。
對於上述加密感興趣的朋友,可以在網上搜索相關的內容。
設置WifiConfiguration的屬性:
WifiConfiguration.AuthAlgorthm 設置加密方法。
可選參數:LEAP只用於leap,
OPEN 被wpa/wpa2需要,
SHARED需要一個靜態的wep key
WifiConfiguration.GroupCipher 使用GroupCipher 的方法來進行加密。
可選參數:CCMP,TKIP,WEP104,WEP40
WifiConfiguration.KeyMgmt 鍵管理機制(keymanagerment),使用KeyMgmt 進行。
可選參數IEEE8021X,NONE,WPA_EAP,WPA_PSK
WifiConfiguration.PairwiseCipher 設置加密方式。
可選參數 CCMP,NONE,TKIP
WifiConfiguration.Protocol 設置一種協議進行加密。
可選參數 RSN,WPA,
wifiConfiguration.Status 設置當前網絡的狀態。
可選參數CURRENT,DISABLED,ENABLED,
2.WifiLock 設定wifi鎖
WifiManager.createWifiLock(String name) //創建wifi鎖
acquire() // 鎖定
isHeld() //是否鎖定著
release() //解鎖
3.WifiInfo 獲取 wifi信息
WifiManager.getConnectionInfo() //得到WifiInfo
getBSSID() //獲取BSSID
/**
* BSS是一種特殊的Ad-hoc LAN的應用,一個無線網絡至少由一個連接到有線網絡的AP和若干無線工作站組成,這種配置稱為一個基本服務裝置BSS (Basic Service Set)。
* 一群計算機設定相同的BSS名稱,即可自成一個group,而此BSS名稱,即所謂BSSID。
* 通常,手機WLAN中,bssid其實就是無線路由的MAC地址. ESSID 也可認為是SSID, WIFI 網絡名
*/
getDetailedStateOf() //獲取客戶端的連通性
getHiddenSSID() //獲得SSID 是否被隱藏
getIpAddress() // 獲取IP 地址
getLinkSpeed() //獲得連接的速度
getMacAddress() //獲得Mac 地址
getRssi() //獲得802.11n 網絡的信號
getSSID() // 獲得SSID
/** SSID(Service Set Identifier)AP唯一的ID碼,用來區分不同的網絡,最多可以有32個字符,
* 無線終端和AP的SSID必須相同方可通信。無線網卡設置了不同的SSID就可以進入不同網絡,SSID通常由AP廣播出來,
* 通過XP自帶的掃描功能可以相看當前區域內的SSID。出於安全考慮可以不廣播SSID,此時用戶就要手工設置SSID才能進入相應的網絡。
* 簡單說,SSID就是一個局域網的名稱,只有設置為名稱相同SSID的值的電腦才能互相通信。
*/
// getSupplicanState() 返回具體客戶端狀態的信息
4.下面的是一個網上的示例代碼(類似一個工具類,有相應很全的一些方法)
功能
1. 打開關閉wifi
2. 掃描並能查看周圍wifi信息
3. 查看本身wifi鏈接配置信息
4. 鏈接指定wifi(根據netID 鏈接本身配置過的,根據SSID,pwd鏈接新掃描出來的)
import java.util.List;
import android.content.Context;
import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiInfo;
import android.net.wifi.WifiManager;
import android.net.wifi.WifiManager.WifiLock;
public class WifiAdmin {
// 定義WifiManager對象
private WifiManager mWifiManager;
// 定義WifiInfo對象
private WifiInfo mWifiInfo;
// 掃描出的網絡連接列表
private List mWifiList;
// 網絡連接列表
private List mWifiConfiguration;
// 定義一個WifiLock
WifiLock mWifiLock;
public WifiAdmin(Context context) {
// 取得WifiManager WifiInfo
mWifiManager = (WifiManager) context.getSystemService(Context.WIFI_SERVICE);
mWifiInfo = mWifiManager.getConnectionInfo();
}
// 打開WIFI
public void openWifi() {
if (!mWifiManager.isWifiEnabled()) {
mWifiManager.setWifiEnabled(true);
}
}
// 關閉WIFI
public void closeWifi() {
if (mWifiManager.isWifiEnabled()) {
mWifiManager.setWifiEnabled(false);
}
}
// 檢查當前WIFI狀態
public int checkState() {
return mWifiManager.getWifiState();
}
/**
* 掃描===============================================
*
* SSID: mima0000, BSSID: b0:05:94:fa:93:64, capabilities: [WPA2-PSK-CCMP][ESS], level: -65, frequency: 2462
* SSID: ChinaNet-unyU, BSSID:7c:60:97:03:8a:94, capabilities: [WPA-PSK-TKIP][ESS], level: -76, frequency: 2412
*/
public void startScan() {
System.out.println(====開始掃描====);
mWifiManager.startScan();
// 得到掃描結果
mWifiList = mWifiManager.getScanResults();
// 得到配置好的網絡連接
mWifiConfiguration = mWifiManager.getConfiguredNetworks();
}
// 查看掃描結果
public StringBuilder lookUpScan() {
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < mWifiList.size(); i++) {
stringBuilder
.append(Index_ + new Integer(i + 1).toString() + :);
// 將ScanResult信息轉換成一個字符串包
// 其中把包括:BSSID、SSID、capabilities、frequency、level
stringBuilder.append((mWifiList.get(i)).toString());
stringBuilder.append(/n);
}
System.out.println(======掃描結果===+ stringBuilder);
return stringBuilder;
}
// 得到網絡列表
public List getWifiList() {
return mWifiList;
}
// 得到配置好的網絡
public List getConfiguration() {
return mWifiConfiguration;
}
// 指定配置好的網絡進行連接
public void connectConfiguration(int index) {
// 索引大於配置好的網絡索引返回
if (index > mWifiConfiguration.size()) {
return;
}
// 連接配置好的指定ID的網絡 mWifiManager.enableNetwork(mWifiConfiguration.get(index).networkId,
true);
}
/**
* 創建wifilock========================================
*/
public void creatWifiLock() {
mWifiLock = mWifiManager.createWifiLock(Test);
}
// 鎖定WifiLock
public void acquireWifiLock() {
mWifiLock.acquire();
}
// 解鎖WifiLock
public void releaseWifiLock() {
// 判斷時候鎖定
if (mWifiLock.isHeld()) {
mWifiLock.release();
}
}
// 得到MAC地址
public String getMacAddress() {
return (mWifiInfo == null) ? NULL : mWifiInfo.getMacAddress();
}
// 得到接入點的BSSID
public String getBSSID() {
return (mWifiInfo == null) ? NULL : mWifiInfo.getBSSID();
}
// 得到IP地址
public int getIPAddress() {
return (mWifiInfo == null) ? 0 : mWifiInfo.getIpAddress();
}
// 得到連接的ID
public int getNetworkId() {
return (mWifiInfo == null) ? 0 : mWifiInfo.getNetworkId();
}
// 斷開指定ID的網絡
public void disconnectWifi(int netId) {
mWifiManager.disableNetwork(netId);
mWifiManager.disconnect();
}
// 得到WifiInfo的所有信息包
public String getWifiInfo() {
return (mWifiInfo == null) ? NULL : mWifiInfo.toString();
}
// 添加一個網絡並連接
public void addNetwork(WifiConfiguration config) {
int wcgID = mWifiManager.addNetwork(config);
boolean b = mWifiManager.enableNetwork(wcgID, true);
System.out.println(a-- + wcgID);
System.out.println(b-- + b);
}
public WifiConfiguration CreateWifiInfo(String SSID, String Password, int Type){
//清空wificonfig
WifiConfiguration config = new WifiConfiguration();
config.allowedAuthAlgorithms.clear();
config.allowedGroupCiphers.clear();
config.allowedKeyManagement.clear();
config.allowedPairwiseCiphers.clear();
config.allowedProtocols.clear();
config.SSID = + SSID + ; //wifi名稱
WifiConfiguration tempConfig = this.IsExsits(SSID);
if(tempConfig != null) {
mWifiManager.removeNetwork(tempConfig.networkId);
}
if(Type == 1) //WIFICIPHER_NOPASS
{
config.wepKeys[0] = ;
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
config.wepTxKeyIndex = 0;
}
if(Type == 2) //WIFICIPHER_WEP
{
config.hiddenSSID = true;
config.wepKeys[0]= +Password+;
config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.SHARED);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP40);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.WEP104);
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
config.wepTxKeyIndex = 0;
}
if(Type == 3) //WIFICIPHER_WPA
{
config.preSharedKey = +Password+; //密碼
config.hiddenSSID = true;
config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN);
config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP);
//config.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
//需要輸入密碼時 config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);
config.status = WifiConfiguration.Status.ENABLED;
}
return config;
}
private WifiConfiguration IsExsits(String SSID){
List existingConfigs = mWifiManager.getConfiguredNetworks();
for (WifiConfiguration existingConfig : existingConfigs){
if (existingConfig.SSID.equals(+SSID+)){
return existingConfig;
}
}
return null;
}
}
5.當然咯,用到了wifi ,可能程序會需要在 wifi有網沒網的情況下進行一些操作,類似斷線重連,界面顯示的不同,這就需要監聽wifi的狀態辣
public class WifiReceiver extends BroadcastReceiver{
@Override
public void onReceive(Context context, Intent intent) {
if(intent.getAction().equals(WifiManager.RSSI_CHANGED_ACTION)){
}else if(intent.getAction().equals(
WifiManager.NETWORK_STATE_CHANGED_ACTION)){
//wifi網絡變化
System.out.println(網絡狀態改變);
NetworkInfo info =intent.
getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
if(info.getState().equals(NetworkInfo.State.DISCONNECTED)){
//網絡斷開了
}else if(info.getState().equals(NetworkInfo.State.CONNECTED)){
//網絡連接上了
WifiManager wifiManager = (WifiManager)context.getSystemService(
Context.WIFI_SERVICE);
WifiInfo wifiInfo = wifiManager.getConnectionInfo();
//獲取當前wifi名稱
System.out.println(連接到網絡 + wifiInfo.getSSID());
}
}else if(intent.getAction().equals(
WifiManager.WIFI_STATE_CHANGED_ACTION)){
//wifi打開與否
int wifistate = intent.getIntExtra(WifiManager.EXTRA_WIFI_STATE, 0);
if(wifistate == WifiManager.WIFI_STATE_DISABLED){
System.out.println(wifi關閉了);
}
else if(wifistate == WifiManager.WIFI_STATE_ENABLED){
System.out.println(wifi開啟中);
}
}
}
}
//配置文件receiver intetfilter
6. wifi方面的權限
Preference主要實現一些配置數據,一些我們上次點擊選擇的內容,我們希望在下次應用調起的時候依然有效,無須用戶再一次進行配置或選擇。Android提供
編譯時出現/usr/bin/ld: skipping incompatible /usr/lib/gcc/x86_64-linux-gnu/4.4.5/../../..
看了這篇文章Android Studio如何查看資源或者函數在哪些類中被引用,知道了快捷鍵失效的原因,其中有一個原因就是快捷鍵沖突,那如何查看快捷鍵哪些項沖突了呢? A
先上圖 LEDView效果如圖所示。 之前看到一篇博客使用兩個TextView實現了該效果,於是我想用自定義控件的方式實現一個LEDView,使用時即可直接使用該控件。