1. 程式人生 > >Android WIFI應用簡單開發例項

Android WIFI應用簡單開發例項

在網上參閱相關資料後,簡單修改提煉,完成自己想要的簡單開發例項,記之以備查閱。

主要功能:turn on wifi,scan wifi 熱點,鎖定wifi連線,監聽wifi開啟/關閉及網路連線/斷開的系統訊息,根據wifi加密型別自動連線(注:存在的問題有,1.在Android 4.x的裝置上,無密碼與WPA加密型別驗證OK,但Android5.x的裝置上卻沒有成功,不確定什麼原因;2. WPA2的密碼型別還沒弄 )。

package com.example.wifitest;

import java.util.List;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.content.IntentFilter;
import android.net.ConnectivityManager;
import android.net.NetworkInfo;
import android.net.NetworkInfo.State;
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;
import android.util.Log;

public class WifiAdmin {
	private static final String TAG = "wifi";
	private static final int NOPASSWORD = 0;
	private static final int PASSWORD_WPA = 1;
	private static final int PASSWORD_WEP = 2;
	private static final int PASSWORD_WPA2 = 3;

	// 定義WifiManager物件
	private WifiManager mWifiManager;
	// 定義一個WifiLock
	private WifiLock mWifiLock;
	private String mSSID;
	private int delSSID;
	private String mPassword;
	private Context mContext;
	private ConnectivityManager networkManager;

	// 構造器
	public WifiAdmin(Context context) {
		// 取得WifiManager物件
		mWifiManager = (WifiManager) context
				.getSystemService(Context.WIFI_SERVICE);
		networkManager = (ConnectivityManager) context
				.getSystemService(Context.CONNECTIVITY_SERVICE);
		mContext = context;

		IntentFilter filter = new IntentFilter();
		filter.addAction(WifiManager.NETWORK_STATE_CHANGED_ACTION);
		filter.addAction(WifiManager.WIFI_STATE_CHANGED_ACTION);
		context.registerReceiver(wifiNetStateReceiver, filter);
	}

	// 開啟WIFI
	public boolean openWifi() {
		if (mWifiManager == null)
			return false;
		if (!mWifiManager.isWifiEnabled()) {
			mWifiManager.setWifiEnabled(true);
		}
		return true;
	}

	// 關閉WIFI
	public void closeWifi() {
		if (mWifiManager != null && mWifiManager.isWifiEnabled()) {
			mWifiManager.setWifiEnabled(false);
		}
	}

	// 檢查當前WIFI狀態
	public int checkState() {
		return mWifiManager.getWifiState();
	}

	// 鎖定WifiLock
	public void acquireWifiLock() {
		mWifiLock.acquire();
	}

	// 解鎖WifiLock
	public void releaseWifiLock() {
		if (mWifiLock.isHeld()) {
			mWifiLock.acquire();
		}
	}

	// 建立一個WifiLock
	public void creatWifiLock() {
		mWifiLock = mWifiManager.createWifiLock("Test");
	}

	private BroadcastReceiver wifiNetStateReceiver = new BroadcastReceiver() {
		@Override
		public void onReceive(Context arg0, Intent intent) {
			if (intent.getAction().equals(
					WifiManager.NETWORK_STATE_CHANGED_ACTION)) {
				NetworkInfo info = intent
						.getParcelableExtra(WifiManager.EXTRA_NETWORK_INFO);
				if (info.getState().equals(NetworkInfo.State.DISCONNECTED)) {
					Log.d(TAG, mSSID + " connect failure!");
					mWifiManager.removeNetwork(delSSID);
					scanWifi();
					mContext.unregisterReceiver(wifiNetStateReceiver);
				} else if (info.getState().equals(NetworkInfo.State.CONNECTED)) {
					Log.d(TAG, mSSID + " connect success!");
					mContext.unregisterReceiver(wifiNetStateReceiver);
				}
			}
			
			if (intent.getAction()
					.equals(WifiManager.WIFI_STATE_CHANGED_ACTION)) {
				int wifistate = intent.getIntExtra(
						WifiManager.EXTRA_WIFI_STATE,
						WifiManager.WIFI_STATE_DISABLED);

				if (wifistate == WifiManager.WIFI_STATE_DISABLED) {
					Log.d(TAG, " turn off wifi!");
				} else if (wifistate == WifiManager.WIFI_STATE_ENABLED) {
					Log.d(TAG, " turn on wifi!");
				}
			}
		}
	};

	private BroadcastReceiver wifiScanReceiver = new BroadcastReceiver() {
		@Override
		public void onReceive(Context arg0, Intent intent) {
			boolean found = false;
			List<ScanResult> mWifiScanResultLists;
			if (intent.getAction().equals(
					WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) {
				mWifiScanResultLists = mWifiManager.getScanResults();
				if (mWifiScanResultLists != null) {
					for (ScanResult wifiScanResultList : mWifiScanResultLists) {
						Log.d(TAG, " wifiScanResultList.SSID:"
								+ wifiScanResultList.SSID);
						if (wifiScanResultList.SSID.equals(mSSID)) {
							found = true;
							connectToTarget(wifiScanResultList.capabilities);
							Log.d(TAG, "found " + mSSID + " in scan result!");
							mContext.unregisterReceiver(wifiScanReceiver);// 取消監聽
							break;
						}
					}
				}
				if (!found) {
					Log.d(TAG, "not found " + mSSID + " in scan result!");
				}
			}
		}
	};

	private WifiConfiguration createWifiCfg(String ssid, String password,
			int method) {

		// closeWifi();
		Log.d(TAG, " createWifiCfg..........................");
		WifiConfiguration wifiCfg = new WifiConfiguration();

		wifiCfg.allowedAuthAlgorithms.clear();
		wifiCfg.allowedGroupCiphers.clear();
		wifiCfg.allowedKeyManagement.clear();
		wifiCfg.allowedPairwiseCiphers.clear();
		wifiCfg.allowedProtocols.clear();

		wifiCfg.SSID = "\"" + ssid + "\"";

		switch (method) {
		case NOPASSWORD:/* no password */
			Log.d(TAG, " createWifiCfg........no password ");
			wifiCfg.wepKeys[0] = "";
			wifiCfg.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
			wifiCfg.wepTxKeyIndex = 0;
			break;
		case PASSWORD_WPA:/* have password :WPA */
			Log.d(TAG, " createWifiCfg.........have password :WPA");
			wifiCfg.preSharedKey = "\"" + password + "\"";
			wifiCfg.hiddenSSID = true;
			wifiCfg.allowedAuthAlgorithms
					.set(WifiConfiguration.AuthAlgorithm.OPEN);
			wifiCfg.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
			wifiCfg.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK);
			wifiCfg.allowedPairwiseCiphers
					.set(WifiConfiguration.PairwiseCipher.TKIP);

			wifiCfg.allowedProtocols.set(WifiConfiguration.Protocol.WPA);
			// wifiCfg.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
			// wifiCfg.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP);

			wifiCfg.status = WifiConfiguration.Status.ENABLED;
			break;
		case PASSWORD_WEP:/* have password :WEP */
			Log.d(TAG, " createWifiCfg.........have password :WEP");
			wifiCfg.preSharedKey = "\"" + password + "\"";
			wifiCfg.hiddenSSID = true;
			wifiCfg.allowedAuthAlgorithms
					.set(WifiConfiguration.AuthAlgorithm.SHARED);
			wifiCfg.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP);
			wifiCfg.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
			wifiCfg.allowedGroupCiphers
					.set(WifiConfiguration.GroupCipher.WEP40);
			wifiCfg.allowedGroupCiphers
					.set(WifiConfiguration.GroupCipher.WEP104);
			wifiCfg.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE);
			wifiCfg.wepTxKeyIndex = 0;
			break;
		default:
			wifiCfg = null;
			break;
		}

		return wifiCfg;
	}

	private WifiConfiguration isConfigHotSpot() {
		List<WifiConfiguration> mWifiHotSpotLists = mWifiManager
				.getConfiguredNetworks();
		for (WifiConfiguration wifiConfiguration : mWifiHotSpotLists) {
			if (wifiConfiguration.SSID.equals("\"" + mSSID + "\"")) {
				Log.d(TAG, "before have cfg this hotspot:"
						+ wifiConfiguration.SSID);
				return wifiConfiguration;
			}
		}
		return null;
	}

	private void connectToTarget(String capability) {
		int mNetworkID;
		int password_type = 0;
		WifiConfiguration mTargetWifiCfg;

		if (capability != null) {
			if (capability.contains("WPA2") || capability.contains("wpa2")) {
				password_type = PASSWORD_WPA2;
			} else if (capability.contains("WPA") || capability.contains("wpa")) {
				password_type = PASSWORD_WPA;
			} else if (capability.contains("WEP") || capability.contains("wep")) {
				password_type = PASSWORD_WEP;
			} else {
				password_type = NOPASSWORD;
			}
		}

		mTargetWifiCfg = createWifiCfg(mSSID, mPassword, password_type);
		mNetworkID = mWifiManager.addNetwork(mTargetWifiCfg);
		mWifiManager.enableNetwork(mNetworkID, true);
		mWifiManager.reassociate();
	}

	private boolean wifiNetworkAvailable() {
		boolean NetworkFlag = false;
		boolean wifiNetworkFlag = false;
		State wifi = null;

		// 去進行判斷網路是否連線
		if (networkManager.getActiveNetworkInfo() != null) {
			NetworkFlag = networkManager.getActiveNetworkInfo().isAvailable();
		}
		if (NetworkFlag) {
			wifi = networkManager.getNetworkInfo(ConnectivityManager.TYPE_WIFI)
					.getState();
			if (wifi == State.CONNECTED || wifi == State.CONNECTING) {
				wifiNetworkFlag = true;
			}
		}

		return wifiNetworkFlag;
	}

	private synchronized void scanWifi() {
		mContext.registerReceiver(wifiScanReceiver, new IntentFilter(
				WifiManager.SCAN_RESULTS_AVAILABLE_ACTION));
		// 開始搜尋,當搜尋到可用的wifi時,將傳送WifiManager.SCAN_RESULTS_AVAILABLE_ACTION的廣播
		mWifiManager.startScan();
	}

	private boolean currentWifi() {
		WifiInfo info = mWifiManager.getConnectionInfo();
		return info.getSSID().equals("\"" + mSSID + "\"") ? true : false;
	}

	public synchronized void connectToTargetWifi(String ssid, String password) {
		mSSID = ssid;
		mPassword = password;
		WifiConfiguration mWifiConfiguration;
		if (openWifi()) {
			// 判斷是否已經配置,並且嘗試連線
			mWifiConfiguration = isConfigHotSpot();
			if (mWifiConfiguration != null) {
				// 判斷該SSID是否已經連線
				if (wifiNetworkAvailable() && currentWifi()) {
					return;
				} else {
					mWifiManager.enableNetwork(mWifiConfiguration.networkId,
							true);
					if (mWifiManager.reconnect()) {
						// 註冊訊息通知
						mContext.registerReceiver(
								wifiNetStateReceiver,
								new IntentFilter(
										WifiManager.NETWORK_STATE_CHANGED_ACTION));
						delSSID = mWifiConfiguration.networkId;
						return;
					} else {
						mWifiManager
								.removeNetwork(mWifiConfiguration.networkId);
					}
				}
			}
			scanWifi();
		}
	}
}