Android WIFI應用簡單開發例項
阿新 • • 發佈:2019-01-23
在網上參閱相關資料後,簡單修改提煉,完成自己想要的簡單開發例項,記之以備查閱。
主要功能: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(); } } }