1. 程式人生 > >Android WiFi功能實現,知其然必知其所以然!(一)

Android WiFi功能實現,知其然必知其所以然!(一)


        有一段時間沒有更新部落格,想說的話太多,一時間都堆積在一起。還沒有練就一心兩用的神功,只好一點一點理清後跟大家說一說。
馬上就是平安夜,然後聖誕節。這些年一直沒有過一次這西方的節日。此次也很想親身體驗一番,所以定好行程,從五道口至西單,然後三里屯和工體。看一看這聖誕節期間北京最美的夜景。
聖誕節要來了,我這裡準備了一些小禮物,這一年攢了不少襪子,大家誰想要禮物的,我把它放進襪子裡送過去。
談到聖誕,就不得不吐槽一下中國的春節了。
以前,看過一檔節目,趙忠祥老師主持的動物世界,其中有這樣一個片段:在一望無際的大草原上,每到動物遷徙的季節,有著數十萬上百萬的動物大軍,浩浩蕩蕩的開始遷徙之路。趙忠祥老師是這樣解說的:“這是歷史上最大的一次哺乳動物遷徙”。然後,高手永遠在民間,有網友補刀:“你是沒見過中國的春運”。
每年春節,雖然也經歷過搶票的過程,但感覺今年尤其困難。網上各種搶票軟體連刷4、5天,毛都沒有。想我修煉多年的麒麟臂仍然敗下陣來,只好感嘆強中自有強中手,我泱泱大國,輝煌可待。。。年關將近,卻一票難求,使我夜不能寐。歸家心切,使我一直堅持刷P。天行健,君子以自強不息;刷車票,大夥要廢寢忘食。在我不懈努力下,誰說一P難求。仰天大笑出門去,我輩豈是無票人。----“妹子,約麼,我有票”----“啪!”
於是我悟出個道理,唯有堅持不懈,才能走向勝利!
扯淡結束,言歸正傳。

Android WiFi功能實現,知其然必知其所以然!(二)

WiFi已經在我們生活中無孔不入,上班,吃飯,睡覺等等,可以說我們的吃喝拉撒睡的過程中,一直都有WiFi的存在,有它陪伴,不孤獨。。。
這就是我們每次到一個新地方,吃飯,看電影,遊玩等等,看到老闆的第一句話不是常用的:老闆你好!而是:老闆你好,有WiFi麼?----“什麼?沒有?這地方的飯菜肯定不好吃,此處不留爺,自有留爺處。”然後,瀟灑的尋找下一個有WiFi的落腳點。那麼問題來了?
什麼是WiFi?----Wi-Fi是一種可以將個人電腦、手持裝置(如pad、手機)等終端以無線方式互相連線的技術,事實上它是一個高頻無線電訊號。引自百科
程式碼是最好的老師,在Android中,android.net.wifi包下提供了幾個重要的操作WiFi的類。
ScanResult.java
    Class Overview
Describes information about a detected access point. In addition to the attributes described here, the supplicant keeps track of quality, noise, and maxbitrate attributes, but does not currently report them to external clients.


該類通過WiFi硬體掃描獲取到WiFi熱點的資訊,包括WiFi名稱,身份認證,地址,訊號強度,頻率等。




public class
WifiConfiguration
extends Object
implements Parcelable
java.lang.Object
   ↳android.net.wifi.WifiConfiguration
Class Overview
A class representing a configured Wi-Fi network, including the security configuration.


該類描述WiFi網路的配置,包括安全設定。主要欄位有:


BSSID:
   BSS是一種特殊的Ad-hoc LAN(一種支援點對點訪問的無線網路應用模式)的應用,一個無線網路至少由一個連線到有線網路的AP和若干無線工作站組成,這種配置稱為一個基本服務裝置。一群計算機設定相同的 BSS名稱,即可自成一個group,而此BSS名稱,即所謂BSSID。通常,手機WLAN中,bssid其實就是無線路由的MAC地址。


networkid:網路ID。


PreSharedKey:無線網路的安全認證模式。


SSID:SSID(Service Set Identif)用於標識無線區域網,SSID不同的無線網路是無法進行互訪的。




public class
WifiInfo
extends Object
implements Parcelable
java.lang.Object
   ↳android.net.wifi.WifiInfo
Class Overview
Describes the state of any Wifi connection that is active or is in the process of being set up.


wifi無線連線的描述,包括(接入點,網路連線狀態,隱藏的接入點,IP地址,連線速度,MAC地址,網路ID,訊號強度等資訊)。這裡簡單介紹一下WifiManager中常用的方法:


getSSID()獲得SSID(熱點名稱)
getBSSID()
獲取BSSID
getDetailedStateOf()獲取客戶端的連通性
getHiddenSSID()獲得SSID 是否被隱藏
getIpAddress()獲取IP 地址
getLinkSpeed()獲得連線的速度
getMacAddress()獲得Mac 地址
getRssi()獲得802.11n 網路的訊號


WifiManager
extends Object
java.lang.Object
   ↳android.net.wifi.WifiManager
Class Overview
This class provides the primary API for managing all aspects of Wi-Fi connectivity. Get an instance of this class by callingContext.getSystemService(Context.WIFI_SERVICE). It deals with several categories of items:


The list of configured networks. The list can be viewed and updated, and attributes of individual entries can be modified.
The currently active Wi-Fi network, if any. Connectivity can be established or torn down, and dynamic information about the state of the network can be queried.
Results of access point scans, containing enough information to make decisions about what access point to connect to.
It defines the names of various Intent actions that are broadcast upon any sort of change in Wi-Fi state.
This is the API to use when performing Wi-Fi specific operations. To perform operations that pertain to network connectivity at an abstract level, use ConnectivityManager.
wifi連線統一管理類,獲取WIFI網絡卡的狀態(WIFI網絡卡的狀態是由一系列的整形常量來表示的)。
WIFI_STATE_DISABLING = 0WIFI網絡卡正在關閉
WIFI_STATE_DISABLED = 1WIFI網絡卡不可用
WIFI_STATE_ENABLING = 2WIFI網正在開啟 (WIFI啟動需要一段時間)
WIFI_STATE_ENABLED = 3WIFI網絡卡可用
WIFI_STATE_UNKNOWN = 4未知網絡卡狀態
WIFI_AP_STATE_DISABLING = 10WIFI熱點正在關閉
WIFI_AP_STATE_DISABLED = 11WIFI熱點不可用
WIFI_AP_STATE_ENABLING = 12WIFI熱點正在開啟
WIFI_AP_STATE_ENABLED = 13WIFI熱點可用
以上摘自網路,簡單的介紹後,使用WiFi,需要提供下面的操作權

<span style="font-size:18px;">    <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></span>


下面是我整理的常用的操作WiFi的方法。註釋已經寫在程式碼中。WiFi工具類

package com.lizhipeng.wifiHotPoint.activity.utils;

import java.lang.reflect.Field;
import java.lang.reflect.Method;
import java.util.Iterator;
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;

/**
 * WiFi工具類
 * 
 * @author lizhipeng
 * 
 */
public class WiFiUtil {

	/**
	 * 是否存在網路資訊
	 * 
	 * @param str
	 *            熱點名稱
	 * @return
	 */
	public static WifiConfiguration isExsits(String str, WifiManager wifiManager) {
		Iterator localIterator = wifiManager.getConfiguredNetworks().iterator();
		WifiConfiguration localWifiConfiguration;
		do {
			if (!localIterator.hasNext())
				return null;
			localWifiConfiguration = (WifiConfiguration) localIterator.next();
		} while (!localWifiConfiguration.SSID.equals("\"" + str + "\""));
		return localWifiConfiguration;
	}

	/** 鎖定WifiLock,當下載大檔案時需要鎖定,防止中途掛掉 **/
	public static void AcquireWifiLock(WifiLock wifiLock) {
		wifiLock.acquire();
	}


	/** 解鎖WifiLock **/
	public static void ReleaseWifilock(WifiLock wifiLock) {
		if (wifiLock.isHeld()) { // 判斷是否鎖定
			wifiLock.acquire();
		}
	}

	/** 開啟Wifi **/
	public static void OpenWifi(WifiManager wifiManager) {
		if (!wifiManager.isWifiEnabled()) { // 當前wifi不可用
			wifiManager.setWifiEnabled(true);
		}
	}

	/** 關閉Wifi **/
	public static void closeWifi(WifiManager wifiManager) {
		if (wifiManager.isWifiEnabled()) {
			wifiManager.setWifiEnabled(false);
		}
	}

	/** 關閉埠指定id的WiFi連線 **/
	public static void disconnectWifi(WifiManager wifiManager,int paramInt) {
		wifiManager.disableNetwork(paramInt);
	}

	/**
	 * 連線指定配置好的網路
	 * @param wifiManager WiFi管理器
	 * @param wifiConfiguration 要連線的WiFi配置物件
	 * @param disableOthers 為true則取消其他網路連線,通常為true
	 */
	public void connectConfiguration(WifiManager wifiManager,WifiConfiguration wifiConfiguration,boolean disableOthers) {
		// 連線配置好的指定ID的網路
		wifiManager.enableNetwork(wifiConfiguration.networkId, disableOthers);
	}

//	/**
//	 * 根據wifi資訊建立或關閉一個熱點
//	 * 
//	 * @param paramWifiConfiguration
//	 * @param paramBoolean
//	 *            關閉標誌
//	 */
//	public void createWifiAP(WifiConfiguration paramWifiConfiguration,
//			boolean paramBoolean) {
//		try {
//			Class localClass = this.wifiManager.getClass();
//			Class[] arrayOfClass = new Class[2];
//			arrayOfClass[0] = WifiConfiguration.class;
//			arrayOfClass[1] = Boolean.TYPE;
//			Method localMethod = localClass.getMethod("setWifiApEnabled",
//					arrayOfClass);
//			WifiManager localWifiManager = this.wifiManager;
//			Object[] arrayOfObject = new Object[2];
//			arrayOfObject[0] = paramWifiConfiguration;
//			arrayOfObject[1] = Boolean.valueOf(paramBoolean);
//			localMethod.invoke(localWifiManager, arrayOfObject);
//			return;
//		} catch (Exception e) {
//			e.printStackTrace();
//		}
//	}

	/**
	 * 建立一個WiFi資訊
	 * 
	 * @param ssid
	 *            名稱
	 * @param passawrd
	 *            密碼
	 * @param paramInt
	 *            有3個引數,1是無密碼,2是簡單密碼,3是wap加密
	 * @param type
	 *            是"ap"還是"wifi"
	 * @return
	 */
	public static WifiConfiguration createWifiInfo(WifiManager wifiManager,String ssid, String passawrd,
			int paramInt, String type) {
		// 配置網路資訊類
		WifiConfiguration localWifiConfiguration1 = new WifiConfiguration();
		// 設定配置網路屬性
		localWifiConfiguration1.allowedAuthAlgorithms.clear();
		localWifiConfiguration1.allowedGroupCiphers.clear();
		localWifiConfiguration1.allowedKeyManagement.clear();
		localWifiConfiguration1.allowedPairwiseCiphers.clear();
		localWifiConfiguration1.allowedProtocols.clear();

		if (type.equals("wifi")) { // wifi連線
			localWifiConfiguration1.SSID = ("\"" + ssid + "\"");
//			WifiConfiguration localWifiConfiguration2 = isExsits(ssid,wifiManager);
//			if (localWifiConfiguration2 != null) {
//				wifiManager.removeNetwork(localWifiConfiguration2.networkId); // 從列表中刪除指定的網路配置網路
//			}
			if (paramInt == 1) { // 沒有密碼
				localWifiConfiguration1.wepKeys[0] = "";
				localWifiConfiguration1.allowedKeyManagement.set(0);
				localWifiConfiguration1.wepTxKeyIndex = 0;
			} else if (paramInt == 2) { // 簡單密碼
				localWifiConfiguration1.hiddenSSID = true;
				localWifiConfiguration1.wepKeys[0] = ("\"" + passawrd + "\"");
			} else { // wap加密
				localWifiConfiguration1.preSharedKey = ("\"" + passawrd + "\"");
				localWifiConfiguration1.hiddenSSID = true;
				localWifiConfiguration1.allowedAuthAlgorithms.set(0);
				localWifiConfiguration1.allowedGroupCiphers.set(2);
				localWifiConfiguration1.allowedKeyManagement.set(1);
				localWifiConfiguration1.allowedPairwiseCiphers.set(1);
				localWifiConfiguration1.allowedGroupCiphers.set(3);
				localWifiConfiguration1.allowedPairwiseCiphers.set(2);
			}
		} else {// "ap" wifi熱點
			localWifiConfiguration1.SSID = ssid;
			localWifiConfiguration1.allowedAuthAlgorithms.set(1);
			localWifiConfiguration1.allowedGroupCiphers
					.set(WifiConfiguration.GroupCipher.CCMP);
			localWifiConfiguration1.allowedGroupCiphers
					.set(WifiConfiguration.GroupCipher.TKIP);
			localWifiConfiguration1.allowedGroupCiphers
					.set(WifiConfiguration.GroupCipher.WEP40);
			localWifiConfiguration1.allowedGroupCiphers
					.set(WifiConfiguration.GroupCipher.WEP104);
			localWifiConfiguration1.allowedKeyManagement.set(0);
			localWifiConfiguration1.wepTxKeyIndex = 0;
			if (paramInt == 1) { // 沒有密碼
				localWifiConfiguration1.wepKeys[0] = "";
				localWifiConfiguration1.allowedKeyManagement.set(0);
				localWifiConfiguration1.wepTxKeyIndex = 0;
			} else if (paramInt == 2) { // 簡單密碼
				localWifiConfiguration1.hiddenSSID = true;// 網路上不廣播ssid
				localWifiConfiguration1.wepKeys[0] = passawrd;
			} else if (paramInt == 3) {// wap加密
				localWifiConfiguration1.preSharedKey = passawrd;
				localWifiConfiguration1.allowedAuthAlgorithms.set(0);
				localWifiConfiguration1.allowedProtocols.set(1);
				localWifiConfiguration1.allowedProtocols.set(0);
				localWifiConfiguration1.allowedKeyManagement.set(1);
				localWifiConfiguration1.allowedPairwiseCiphers.set(2);
				localWifiConfiguration1.allowedPairwiseCiphers.set(1);
			}
		}
		return localWifiConfiguration1;
	}

	/** 獲取wifi名 **/
	public static String getBSSID(WifiInfo wifiInfo) {
		if (wifiInfo == null)
			return "NULL";
		return wifiInfo.getBSSID();
	}
	
	/**
	 * WifiInfo 無線連線的描述類,包括(接入點,網路連線狀態,隱藏的接入點,IP地址,連線速度,MAC地址,網路ID,訊號強度等資訊)。
	 * wInfo.getBSSID();// 獲取BSSID
	 * wInfo.getHiddenSSID();// 獲得SSID 是否被隱藏
	 * wInfo.getIpAddress();// 獲取IP 地址
	 * wInfo.getLinkSpeed();// 獲得連線的速度
	 * wInfo.getMacAddress();// 獲得Mac 地址
	 * wInfo.getRssi();// 獲得802.11n 網路的訊號
	 * wInfo.getSSID();// 獲得SSID
	 * SupplicantState suppState = wInfo.getSupplicantState();// 返回具體客戶端狀態的資訊
	 * wInfo.getDetailedStateOf(suppState);// 獲取客戶端的連通性
	 * @param wifiManager WiFi管理器
	 * @return WifiInfo物件
	 */
	public static WifiInfo getWifiInfo(WifiManager wifiManager){
		WifiInfo wInfo = wifiManager.getConnectionInfo();//獲取當前連線的info 
		return wInfo;
	}


	/**
	 * 獲得搜尋到的WiFi列表
	 * @param wifiManager WiFi管理器
	 * @return 搜尋到得WiFi列表
	 */
	public static List<ScanResult> getWifiList(WifiManager wifiManager) {
		wifiManager.startScan();//開始搜尋
		List<ScanResult> list = wifiManager.getScanResults();
		return list;
	}

	/**
	 * 檢視掃描的結果
	 * @param list 搜尋到的WiFi列表
	 * @return
	 */
	public StringBuilder lookUpScan(List<ScanResult> list) {
		StringBuilder localStringBuilder = new StringBuilder();
		for (int i = 0; i < list.size(); i++) {
			localStringBuilder.append("Index_" + new Integer(i + 1).toString()
					+ ":");
			// 將ScanResult資訊轉換成一個字串包
			// 其中把包括:BSSID、SSID、capabilities、frequency、level
			localStringBuilder.append((list.get(i)).toString());
			localStringBuilder.append("\n");
		}
		return localStringBuilder;
	}
}



WiFi熱點工具類:由於WiFi熱點的方法是隱藏的,所以使用是需要用到反射呼叫其方法。
package com.lizhipeng.wifiHotPoint.activity.utils;

import java.lang.reflect.Field;
import java.lang.reflect.InvocationTargetException;
import java.lang.reflect.Method;
import java.util.List;

import com.lizhipeng.wifiHotPoint.activity.MainActivity;

import android.net.wifi.ScanResult;
import android.net.wifi.WifiConfiguration;
import android.net.wifi.WifiManager;
import android.util.Log;

/**
 * WiFi熱點工具類
 * 
 * @author lizhipeng
 * 
 */
public class WifiHotPointUtils {

	public static final String TAG = "WifiHotPointUtils";

	/**
	 * 開啟WiFi熱點
	 * 
	 * @param wifiManager
	 *            WiFi管理器
	 * @param wifiName
	 *            WiFi熱點名字
	 * @param password
	 *            WiFi熱點密碼
	 * @param paramInt
	 *            WiFi熱點密碼有3個引數,1是無密碼,2是簡單密碼,3是wap加密
	 * @return 返回是否成功狀態
	 */
	public static boolean openWifiHotPoint(WifiManager wifiManager,
			String wifiName, String password, int paramInt) {
		// 開啟熱點前,如果WiFi可用,先關閉WiFi
		if (wifiManager.isWifiEnabled()) {
			wifiManager.setWifiEnabled(false);
		}
		Log.i(TAG, "into startWifiAp() 啟動一個Wifi 熱點!");
		Method method1 = null;
		boolean ret = false;
		try {
			method1 = wifiManager.getClass().getMethod("setWifiApEnabled",
					WifiConfiguration.class, boolean.class);
			Log.i(TAG, "out createPassHotWifiConfig() 新建一個Wifi配置! SSID ="
					+ wifiName + " password =" + password);
			WifiConfiguration config = new WifiConfiguration();
			config.allowedAuthAlgorithms.clear();
			config.allowedGroupCiphers.clear();
			config.allowedKeyManagement.clear();
			config.allowedPairwiseCiphers.clear();
			config.allowedProtocols.clear();

			config.SSID = wifiName;

			WifiConfiguration tempConfig = IsExsits(wifiManager, wifiName);
			if (tempConfig != null) {
				wifiManager.removeNetwork(tempConfig.networkId);
			}

			if (paramInt == 1) // WIFICIPHER_NOPASS 不加密
			{
				config.wepKeys[0] = "";
				config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
				config.wepTxKeyIndex = 0;
			}
			if (paramInt == 2) // WIFICIPHER_WEP 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 (paramInt == 3) // WIFICIPHER_WPA 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;
			}

			Log.i(TAG, "out createPassHotWifiConfig() 啟動一個Wifi配置! config.SSID="
					+ config.SSID + "password =" + config.wepKeys[0]);
			ret = (Boolean) method1.invoke(wifiManager, config, true);
		} catch (IllegalArgumentException e) {
			e.printStackTrace();
			Log.d(TAG, "stratWifiAp() IllegalArgumentException e");
		} catch (IllegalAccessException e) {
			e.printStackTrace();
			Log.d(TAG, "stratWifiAp() IllegalAccessException e");
		} catch (InvocationTargetException e) {
			e.printStackTrace();
			Log.d(TAG, "stratWifiAp() InvocationTargetException e");
		} catch (SecurityException e) {
			e.printStackTrace();
			Log.d(TAG, "stratWifiAp() SecurityException e");
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
			Log.d(TAG, "stratWifiAp() NoSuchMethodException e");
		}
		Log.i(TAG, "out startWifiAp() 啟動一個Wifi 熱點!");
		return ret;
	}

	/**
	 * 建立WiFi熱點配置物件
	 * 
	 * @param wifiManager
	 *            WiFi管理器
	 * @param wifiName
	 *            WiFi熱點名字
	 * @param password
	 *            WiFi熱點密碼
	 * @param paramInt
	 *            WiFi熱點密碼有3個引數,1是無密碼,2是簡單密碼,3是wap加密
	 * @return 返回WiFiconfiguration物件
	 */
	public static WifiConfiguration createWifiInfo(WifiManager wifiManager,
			String wifiName, String password, int paramInt) {

		WifiConfiguration apConfig = new WifiConfiguration();
		// apConfig.SSID = wifiName;
		// apConfig.preSharedKey = password;
		apConfig.SSID = "\"" + wifiName + "\"";
		apConfig.preSharedKey = "\"" + password + "\"";
		apConfig.hiddenSSID = true;
		apConfig.status = WifiConfiguration.Status.ENABLED;
		apConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
		apConfig.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
		apConfig.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
		apConfig.allowedPairwiseCiphers
				.set(WifiConfiguration.PairwiseCipher.TKIP);
		apConfig.allowedPairwiseCiphers
				.set(WifiConfiguration.PairwiseCipher.CCMP);
		apConfig.allowedProtocols.set(WifiConfiguration.Protocol.RSN);
		return apConfig;

		// Log.v(TAG, "SSID = " + wifiName + "## Password = " + password +
		// "## Type = " + paramInt);
		//
		// WifiConfiguration config = new WifiConfiguration();
		// config.allowedAuthAlgorithms.clear();
		// config.allowedGroupCiphers.clear();
		// config.allowedKeyManagement.clear();
		// config.allowedPairwiseCiphers.clear();
		// config.allowedProtocols.clear();
		//
		// config.SSID = wifiName;
		//
		// WifiConfiguration tempConfig = IsExsits(wifiManager, wifiName);
		// if (tempConfig != null) {
		// wifiManager.removeNetwork(tempConfig.networkId);
		// }
		//
		// if (paramInt == 1) // WIFICIPHER_NOPASS 不加密
		// {
		// config.wepKeys[0] = "";
		// config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
		// config.wepTxKeyIndex = 0;
		// }
		// if (paramInt == 2) // WIFICIPHER_WEP 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 (paramInt == 3) // WIFICIPHER_WPA 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;
	}

	/**
	 * 連線WiFi熱點
	 * 
	 * @param wifiManager
	 *            WiFi管理器
	 * @param wifiConfig
	 *            需要連線的WiFi網路的配置物件
	 * @return 返回WiFi熱點是否連線成功
	 */
	public static boolean connectHotSpot(WifiManager wifiManager,
			WifiConfiguration wifiConfig) {
		Log.i(TAG, "into enableNetwork(WifiConfiguration wifiConfig)");

		// the ID of the newly created network description
		int wcgID = wifiManager.addNetwork(wifiConfig);
		Log.i(TAG, "into enableNetwork(WifiConfiguration wifiConfig) wcID = "
				+ wcgID);
		if (wcgID < 0) {
			return false;
		}
		boolean flag = wifiManager.enableNetwork(wcgID, true);
		Log.i(TAG, "out enableNetwork(WifiConfiguration wifiConfig)");
		return flag;
	}

	/**
	 * 關閉WiFi熱點
	 * 
	 * @param wifiManager
	 *            WiFi管理器
	 * @return 返回關閉狀態
	 */
	public static boolean closeWifiHotPoint(WifiManager wifiManager) {
		Log.i(TAG, "into closeWifiAp() 關閉一個Wifi 熱點!");
		boolean ret = false;
		if (isWifiApEnabled(wifiManager)) {
			try {
				Method method = wifiManager.getClass().getMethod(
						"getWifiApConfiguration");
				method.setAccessible(true);
				WifiConfiguration config = (WifiConfiguration) method
						.invoke(wifiManager);
				Method method2 = wifiManager.getClass().getMethod(
						"setWifiApEnabled", WifiConfiguration.class,
						boolean.class);
				ret = (Boolean) method2.invoke(wifiManager, config, false);
			} catch (NoSuchMethodException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalArgumentException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (IllegalAccessException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			} catch (InvocationTargetException e) {
				// TODO Auto-generated catch block
				e.printStackTrace();
			}
		}
		Log.i(TAG, "out closeWifiAp() 關閉一個Wifi 熱點!");
		return ret;
	}

	/**
	 * 檢測WiFi熱點是否可用
	 * 
	 * @param wifiManager
	 *            WiFi管理器
	 * @return 是否可用狀態
	 */
	public static boolean isWifiApEnabled(WifiManager wifiManager) {
		try {
			Method method = wifiManager.getClass().getMethod("isWifiApEnabled");
			method.setAccessible(true);
			return (Boolean) method.invoke(wifiManager);
		} catch (NoSuchMethodException e) {
			e.printStackTrace();
		} catch (Exception e) {
			e.printStackTrace();
		}
		return false;
	}

	/**
	 * 通過反射,獲取WiFi熱點名稱 SSID
	 * 
	 * @param wifiManager
	 * @return
	 */
	public static String getApSSID(WifiManager wifiManager) {
		try {
			Method localMethod = wifiManager.getClass().getDeclaredMethod(
					"getWifiApConfiguration", new Class[0]);
			if (localMethod == null)
				return null;
			Object localObject1 = localMethod
					.invoke(wifiManager, new Object[0]);
			if (localObject1 == null)
				return null;
			WifiConfiguration localWifiConfiguration = (WifiConfiguration) localObject1;
			if (localWifiConfiguration.SSID != null)
				return localWifiConfiguration.SSID;
			Field localField1 = WifiConfiguration.class
					.getDeclaredField("mWifiApProfile");
			if (localField1 == null)
				return null;
			localField1.setAccessible(true);
			Object localObject2 = localField1.get(localWifiConfiguration);
			localField1.setAccessible(false);
			if (localObject2 == null)
				return null;
			Field localField2 = localObject2.getClass()
					.getDeclaredField("SSID");
			localField2.setAccessible(true);
			Object localObject3 = localField2.get(localObject2);
			if (localObject3 == null)
				return null;
			localField2.setAccessible(false);
			String str = (String) localObject3;
			return str;
		} catch (Exception localException) {
		}
		return null;
	}

	/**
	 * 獲取WiFi熱點的狀態
	 * 
	 * @param wifiManager
	 *            WiFi管理器
	 * @return
	 */
	public int getWifiApState(WifiManager wifiManager) {
		try {
			int i = ((Integer) wifiManager.getClass()
					.getMethod("getWifiApState", new Class[0])
					.invoke(wifiManager, new Object[0])).intValue();
			return i;
		} catch (Exception localException) {
		}
		return 4; // 未知wifi網絡卡狀態
	}

	/**
	 * 判斷選擇的WiFi熱點是否可以連線
	 * 
	 * @param ssid
	 *            WiFi熱點名 SSID
	 * @param wifiList
	 *            附近的WiFi列表
	 * @return true 可以連線 false 不可以連線(不在範圍內)
	 */
	public static boolean checkCoonectHotIsEnable(String ssid,
			List<ScanResult> wifiList) {
		for (ScanResult result : wifiList) {
			if (result.SSID.equals(ssid)) {
				return true;
			}
		}
		return false;
	}

	/**
	 * 檢查wifi列表中是否有以輸入引數為名的wifi熱點,如果存在,則在開始配置wifi網路之前將其移除,以避免ssid的重複
	 * 
	 * @param wifiManager
	 * @param SSID
	 * @return
	 */
	public static WifiConfiguration IsExsits(WifiManager wifiManager,
			String SSID) {
		List<WifiConfiguration> existingConfigs = wifiManager
				.getConfiguredNetworks();
		if (existingConfigs == null) {
			return null;
		}
		for (WifiConfiguration existingConfig : existingConfigs) {
			if (existingConfig.SSID.equals(SSID)) {
				return existingConfig;
			}
		}
		return null;
	}

	public static List<WifiConfiguration> getWifiConfigurations(
			WifiManager wifiManager) {
		List<WifiConfiguration> existingConfigs = wifiManager
				.getConfiguredNetworks();
		return existingConfigs;
	}

}



今天就寫到這裡,下次我們在工程中實現WiFi建立,搜尋,連線,關閉等功能。由於我也是頭一次研究WiFi,有很多不足之處,還希望大家指正,一起交流學習。


















相關推薦

Android WiFi功能實現所以然

終於吧WiFi功能搞定了,前後歷時半個多月的時間。進度有些慢。但還是很充實的,搞定一個自己面臨的難題時,那種豁然開朗的感覺,讓人神清氣爽。要不是在公司上班時間,真想大吼一聲!“咱老百姓啊,今兒個真高興。。” 我想愛哥,鴻洋和老郭在此的話,肯定嗤之以鼻,心裡碎碎念:老子搞個妞

Android WiFi功能實現所以然

        有一段時間沒有更新部落格,想說的話太多,一時間都堆積在一起。還沒有練就一心兩用的神功,只好一點一點理清後跟大家說一說。 馬上就是平安夜,然後聖誕節。這些年一直沒有過一次這西方的節日。此次也很想親身體驗一番,所以定好行程,從五道口至西單,然後三里屯和工體。看

【學以致用】android功能實現7---android8.0 Launcher獲取快捷方式原始碼分析3

獲取完快捷方式的資訊之後,便是如何具體的將快捷方式的名字,圖示和開啟方式放置到桌面上。 最後一步addAndBindAddedWorkspaceItems(                 new LazyShortcutsProvider(context.getAppl

【學以致用】android功能實現5---android8.0 Launcher獲取快捷方式原始碼分析1

從其他應用往桌面建立快捷方式,android8.0統一採用requestPinShortcut的方式。 對於桌面而言,是怎麼從requestPinShortcut獲取快捷方式資訊在桌面建立快捷方式呢? Android8.0的快捷方式引數不再通過廣播傳送,而是存放在系統當中

Android中用SmartRefreshLayout實現ListView列表的資料重新整理與載入更多總結

這裡用到的是第三方外掛:SmartRefreshLayout 效果圖如下: 使用步驟如下: 1、新增遠端依賴 /*重新整理和載入*/ implementation 'com.scwang.smartrefresh:SmartRefreshLayout:1.1.0-

Android UI設計與開發】第06期:底部選單欄使用TabActivity實現底部選單欄

轉載請註明出處:http://blog.csdn.net/yangyu20121224/article/details/8989063               從這一篇文章開始,我們將進入到一個應用程式主介面UI的開發和設計中了,底部選單欄在Android的應用開發當

最簡單的區塊鏈實現不到50行程式碼

什麼是區塊鏈(Blockchain)? 一個電子記賬本,以比特幣和其他密碼加密貨幣進行的交易公開地、按照日期順序記錄其中。 總的來說,它是一個公開的資料庫,新的資料儲存在一個稱為區塊的容器中,並且附加到一個“不可變”的鏈條(即區塊鏈)上,鏈條上還有以前附加的資料。這裡的“不

Windows環境下從零開始搭建Nodejs+Express+Ejs框架---安裝nodejs

直接 分享圖片 完成 info pre download png 安裝包 get 第一步,安裝nodejs https://nodejs.org/en/download/ 這個是nodejs的官網,由於操作系統是win7 64位的,所以,我下載的是node-v8.11.1-

看完就能出去神侃來自研發第一線的“區塊鏈”掃盲文

區塊鏈 代幣 Blockchain 麻將 這兩年要說什麽概念最火,那一定是區塊鏈了。現在要是自己不說一說什麽是公鏈、私鏈,什麽是Token,都不好意思說自己是做IT的。可是什麽是區塊鏈?它的出現能解決我們現實生活中什麽問題?什麽是代幣?什麽是共識機制?什麽是智能合約?這

虎撲《不冷笑話》爬蟲實戰順帶說說最近學寫爬蟲的經歷

前言 樓主16年畢業,工作內容目前主要以ETL開發為主。有一段時間逛知乎,經常看到有人分享一些資料分析的文章,比如美團上的點餐分析、豆瓣的評分分析,還有網易雲音樂熱評分析之類的。感覺這些文章都是有實打實的東西在,而且作者們的文筆也深得我心。後來也知道,這些資料

萬里長征始於足下——菜鳥程式設計師的學習總結

目錄: 最近一直的談論如何學習,如何做筆記,學習方法是否正確?(發現問題——創新的原動力)為什麼開始系統化學習了,反而暴露許許多多的問題?細想也並不是很多,這都是過去的遺留問題,就當磨刀不誤砍柴工吧。 學習VB的時候,我原來學習過一遍。第二次再看視訊學習VB,做筆記,畢竟是自己學過一遍的知識,沒有太

策略模式實現 retrofit 的get和post請求的公共引數

策略模式的作用,作用是替換if,elst if ,switch case,可是為什麼我就替換不了呢? 比如: 圖書價格,初級會員9折,高階會員打8折 通常實現: private double getPrice(int grade, doubl

Android快樂貪吃蛇遊戲實戰專案開發教程-02虛擬方向鍵自定義控制元件概述

一、自定義控制元件簡介 在本專案中,無論是遊戲主區域還是虛擬方向鍵都是通過自定義控制元件來實現的,我們有必要先對自定義控制元件有個簡單的瞭解。而且通過自定義控制元件的學習能更好的理解系統自帶控制元件的內部機制。 什麼是自定義控制元件呢? 我們平時用的控制元件(比如Button、TextVie

《MySQL會》學習筆記、MySQL指令碼下載、執行及USE、SELECT的使用

本文主要介紹《MySQL必知必會》書中,所述的MySQL指令碼下載以及執行,並簡單介紹USE、SELECT關鍵字的基本使用。 1、MySQL指令碼下載及執行 開啟MySQL command Line client(本文利用的是MySQL 8.0.

如何實現同一瀏覽器多個標籤頁之間的通訊——localStorage

一、localStorage (1)localStorage是什麼? localStorage物件在修訂過的HTML5規範中作為持久儲存在客戶端資料的方案取代了globalStorage,是Stor

搞懂通證經濟背後的邏輯助你分辨潛在的好專案

從去年的情況來看,加密貨幣可以做的遠不止取代現有的貨幣,還有很多其他用途,它們可用於資產通證化、訪問dapps、代表所有權、使 Token 持有者成為去中心化網路的主動參與者。 因此,通證正在創造全新的經濟模型,我們將其稱為通證經濟學。 由於其新穎性,通

基於android的網路音樂播放器-本地音樂的載入和後臺播放

作為android初學者,最近把瘋狂android講義和瘋狂Java講義看了一遍,看到書中介紹的知識點非常多,很難全部記住,為了更好的掌握基礎知識點,我將開發一個網路音樂播放器-EasyMusic來鞏固下,也當作是練練手。感興趣的朋友可以看看,有設計不足的地方也

SpringBoot整合Redis以及MybatisPlus分頁、Mapper的使用

概述 這段時間接觸很多知識,也逐漸深入到專案整個流程開發,對Linux也有逐步地認識。雖然有去探索,但感覺能力還不足以寫出來跟大家分享。撰寫本文是瞭解到有些讀者反饋,對於MP(MybatisPlus縮寫)不太瞭解以及如何去使用,但更多還是筆者用完覺得非常強大,

jaxb實現XML與JavaBean的互相轉換遇到的難點

1.首先交代一下背景: 入職後項目組交給我的第一個任務便是做一個酒店直連對接,流程說白了就是發xml報文去攜程的系統,攜程返回xml裡面包含了酒店相關資訊,流程聽著很簡單,但是涉及到跟攜程對接、跟公司內部系統對接,作為一箇中間層,專案進度很難自己把控,再加上酒

使用MATLAB模糊資料工具箱和simulink實現單交叉路口交通燈實時配時演算法

作者的碎碎念         博主的本職工作是一名白帽子,前段時間由於某些原因研究了一點數學建模,故將自己的一點心得整理成教程,一是自己備忘,二是方便後來者。你問我為什麼研究數學建模?因為我有一顆愛折騰的心,哈哈哈。 寫在前面         本文是一篇針對數學建模初學者的