安卓版本:4.4.2 運(yùn)行平臺:廣州微嵌安卓工業(yè)平板

1、安卓使用wifi模塊需在AndroidMainfest.xml聲明權(quán)限:
允許程序改變Wi-Fi連接狀態(tài) <uses-permission android:name="android.permission.CHANGE_WIFI_STATE"/> 允許程序訪問Wi-Fi網(wǎng)絡(luò)狀態(tài)信息 <uses-permission android:name="android.permission.ACCESS_WIFI_STATE"/>
2、獲取WifiManager的實(shí)例,用于操作wifi:
wifiManager = (WifiManager)getSystemService(Service.WIFI_SERVICE);
3、打開或關(guān)閉wifi
//isChecked為true表示打開wifi,false關(guān)閉WiFi if(!wifiManager.wifiEnable(isChecked)) { Toast.makeText(MainActivity.this,"WifisetEnabledfaled", Toast.LENGTH_SHORT).show();; } //獲取WiFi當(dāng)前的狀態(tài) switch(wifiManager.getWifiState()) { //wifi處于關(guān)閉狀態(tài) case WifiManager.WIFI_STATE_DISABLED: enableSwitch.setChecked(false); break; //wifi處于打開狀態(tài) case WifiManager.WIFI_STATE_ENABLED: enableSwitch.setChecked(true); //該方法用于開始掃描附近的wifi熱點(diǎn) wifiManager.startScan(); break; }
4、注冊wifi的相應(yīng)廣播監(jiān)聽wifi的狀態(tài)改變:
//掃描到可用的wifi熱點(diǎn) WifiManager.SCAN_RESULTS_AVAILABLE_ACTION //wifi狀態(tài)改變 WifiManager.WIFI_STATE_CHANGED_ACTION //wifi請求連接成功或失敗 WifiManager.SUPPLICANT_STATE_CHANGED_ACTION //wifi連接或斷開狀態(tài)改變, ConnectivityManager.CONNECTIVITY_ACTION //wifi熱點(diǎn)狀態(tài)改變 "android.net.wifi.WIFI_AP_STATE_CHANGED" 定義BroadcastReceiver接收廣播: class WifiReceiver extends BroadcastReceiver { public void onReceive(Context context, Intent intent) { //掃描到可用熱點(diǎn) if (intent.getAction().equals( WifiManager.SCAN_RESULTS_AVAILABLE_ACTION)) { //獲取最近一次掃描到的wifi列表 resultList = wifiManager.getScanResults(); String[] result = mywifi.getString(resultList); int i=0; for(ScanResult scan:resultList){ //判斷是否已保存了連接信息 if(mywifi.isSaveConfigtion(scan.SSID)!=null){ result[i] += ":已保存"; } i++; } } //wifi或熱點(diǎn)的狀態(tài)發(fā)生改變 else if(intent.getAction() .equals(WifiManager.WIFI_STATE_CHANGED_ACTION)|| intent.getAction() .equals("android.net.wifi.WIFI_AP_STATE_CHANGED")) { //獲取wifi或熱點(diǎn)當(dāng)前的狀態(tài) switch(intent.getIntExtra("wifi_state", 0)){ //wifi狀態(tài)變成關(guān)閉 case 1: adapter.clear(); stateText.setText("Wifi已關(guān)閉"); break; //WiFi狀態(tài)變成打開 case 3: stateText.setText("Wifi已打開"); break; //熱點(diǎn)狀態(tài)變成打開 case 13 apstateText.setText("熱點(diǎn)已打開"); break; //熱點(diǎn)狀態(tài)變成關(guān)閉 case 11: apstateText.setText("熱點(diǎn)已關(guān)閉"); break; default: Log.d("STATE",String.valueOf(intent.getIntExtra("wifi_state", 0))); break; } } //連接狀態(tài)發(fā)生改變 else if(intent.getAction().equals(ConnectivityManager.CONNECTIVITY_ACTION)) { boolean b = false; //獲取當(dāng)前的連接狀態(tài) boolean a = intent.getBooleanExtra("noConnectivity", b); if(!a) { //wifi連接成功,獲取連接的wifi屬性 System.out.println("連接成功"); } else { //wifi已斷開連接 System.out.println("斷開連接"); } } //wifi連接請求成功或失敗 else if(intent.getAction().equals(WifiManager.SUPPLICANT_STATE_CHANGED_ACTION)) { //獲取連接wifi屬性跟請求連接狀態(tài) WifiInfo info = wifiManager.getConnectionInfo(); SupplicantState state = info.getSupplicantState(); int flag =0; boolean connectflag = false; //連接請求成功 if (state == SupplicantState.COMPLETED) { Log.i("WifiReceiver", "(驗(yàn)證成功)"); SSIDText.setText(info.getSSID().substring(1,info.getSSID().length()-1)); //保存連接wifi信息 wifiManager.saveConfiguration(); flag =1; } //獲取請求失敗的錯(cuò)誤值,判斷是否屬于驗(yàn)證失敗 int errorCode = intent.getIntExtra( WifiManager.EXTRA_SUPPLICANT_ERROR, -1); if (errorCode == WifiManager.ERROR_AUTHENTICATING) { Log.i("WifiReceiver", "(驗(yàn)證失敗)"); } } } }
5、在掃描到wifi后獲取wifi的具體屬性:
//參數(shù):掃描到的wifi列表 public String[] getString(List<ScanResult> wifiList) { ArrayList<String> listStr = new ArrayList<String>(); for (int i = 0; i < wifiList.size(); i++) { /*SSID:wifi的標(biāo)示符,也就是名字 *capabilities:描述接入點(diǎn)支持的身份驗(yàn)證、密鑰管理和加密方案 *level:wifi的信號強(qiáng)度 *WifiManager.calculateSignalLevel:將信號強(qiáng)度轉(zhuǎn)換成信號等級 */ listStr.add(scan.SSID+":" +scan.capabilities+":" +String.valueOf(WifiManager.calculateSignalLevel(scan.level, 5))); } return listStr.toArray(new String[0]); }
6、獲取當(dāng)前wifi連入點(diǎn)的一些常用信息
WifiInfo connectInfo = wifiManager.getConnectionInfo(); //連接wifi的名字 connectInfo.getSSID(); //wifi的連接速度跟單位 connectInfo.getLinkSpeed(); connectInfo.LINK_SPEED_UNITS; //連接wifi的ip地址 connectInfo.getIpAddress(); //用下面的轉(zhuǎn)換方法將connectInfo.getIpAddress()轉(zhuǎn)換成String public String intToIp(int i) {return ((i >> 24 ) & 0xFF ) + "." + ((i >> 16 ) & 0xFF) + "." + ((i >> 8 ) & 0xFF) + "." + ( i & 0xFF) ; }
7、創(chuàng)建wifi信息用于wifi連接,分為無密碼、WPA兩種:
/*無密碼連接: *SSID:wifi的標(biāo)識符 *config:用于wifi連接的wifi信息 */ String SSID = ssid; WifiConfiguration config = new WifiConfiguration(); config.allowedAuthAlgorithms.clear(); config.allowedGroupCiphers.clear(); config.allowedKeyManagement.clear(); config.allowedPairwiseCiphers.clear(); config.allowedProtocols.clear(); config.SSID = "\"" + SSID + "\""; 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); /*有密碼連接: *SSID:wifi的標(biāo)識符 *password:wifi密碼 *config:用于wifi連接的wifi信息 */ String gol_password = password; WifiConfiguration config = new WifiConfiguration(); config.SSID = "\"" + ssid + "\""; config.preSharedKey = "\"" + gol_password + "\""; config.hiddenSSID = true; config.status = WifiConfiguration.Status.ENABLED; config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP); config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); config.allowedPairwiseCiphers .set(WifiConfiguration.PairwiseCipher.TKIP); config.allowedPairwiseCiphers .set(WifiConfiguration.PairwiseCipher.CCMP); config.allowedProtocols.set(WifiConfiguration.Protocol.RSN); //使用上面新建的WifiConfiguration config連接wifi: int wcgID = wifiManager.addNetwork(wifiConfig); //連接成功返回true,失敗返回false boolean flag = wifiManager.enableNetwork(wcgID, true);
8、wifi斷開連接:
//SSID:wifi的標(biāo)示符 public boolean disconnectWifi(String SSID) { List<WifiConfiguration> existingConfigs = null; existingConfigs = wifiManager.getConfiguredNetworks();; for (WifiConfiguration existingConfig : existingConfigs) { if (existingConfig.SSID.equals("\"" + SSID + "\"")) { if(wifiManager.disableNetwork(existingConfig.networkId)) { return true; }else break; } } return false; }
9、判斷wifi信息是否已保存:
public WifiConfiguration isSaveConfigtion(String SSID) { List <WifiConfiguration> existingConfigs = null; existingConfigs = wifiManager.getConfiguredNetworks();; for (WifiConfiguration existingConfig : existingConfigs) { if (existingConfig.SSID.equals("\"" + SSID + "\"")) { return existingConfig; } } return null; }
10、刪除保存的wifi信息:
public boolean removeWifi(String SSID) { List<WifiConfiguration> existingConfigs; existingConfigs= wifiManager.getConfiguredNetworks(); for (WifiConfiguration existingConfig : existingConfigs) { if (existingConfig.SSID.equals("\"" + SSID + "\"")) { return wifiManager.removeNetwork(existingConfig.networkId); } } return false; }
至此wifi的打開、關(guān)閉、掃描、連接、斷開等基本功能的開發(fā)就基本結(jié)束了,但是在日常的wifi使用中,我們不僅僅只是連接熱點(diǎn),有時(shí)也會開啟安卓上的本地?zé)狳c(diǎn)供其它安卓設(shè)備連接,所以下面的部分就是設(shè)置本地的wifi熱點(diǎn)信息并打開等功能。
11、熱點(diǎn)跟wifi不能同時(shí)使用,所以在打開熱點(diǎn)前需先關(guān)閉掉wifi
//先判斷wifi是否處于打開的狀態(tài),如果是則先關(guān)閉再打開熱點(diǎn) if(wifiManager.isWifiEnabled()){ wifiManager.setWifiEnabled(false); Toast.makeText(MainActivity.this, "關(guān)閉當(dāng)前wifi,創(chuàng)建熱點(diǎn)", Toast.LENGTH_SHORT).show(); }
創(chuàng)建熱點(diǎn)信息:分為有密碼、無密碼
/*無密碼熱點(diǎn): *SSID:熱點(diǎn)名字 *config:熱點(diǎn)信息 */ WifiConfiguration config = new WifiConfiguration(); config.SSID = ssid; config.wepTxKeyIndex = 0; config.wepKeys[0] = ""; config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.NONE); config.wepTxKeyIndex = 0; /*有密碼熱點(diǎn): *SSID:熱點(diǎn)名字 *password:熱點(diǎn)密碼 *config:熱點(diǎn)信息 */ config.hiddenSSID = true; config.preSharedKey = password; config.allowedAuthAlgorithms.set(WifiConfiguration.AuthAlgorithm.OPEN); config.allowedProtocols.set(WifiConfiguration.Protocol.RSN); config.allowedProtocols.set(WifiConfiguration.Protocol.WPA); config.allowedKeyManagement.set(WifiConfiguration.KeyMgmt.WPA_PSK); config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.CCMP); config.allowedPairwiseCiphers.set(WifiConfiguration.PairwiseCipher.TKIP); config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.CCMP); config.allowedGroupCiphers.set(WifiConfiguration.GroupCipher.TKIP);
使用上面創(chuàng)建的熱點(diǎn)信息打開熱點(diǎn)
//config:熱點(diǎn)信息,打開熱點(diǎn) Method method1 = null; try { method1 = wifiManager.getClass().getMethod("setWifiApEnabled", WifiConfiguration.class, boolean.class); method1.invoke(wifiManager, config, true); } catch (Exception e) { e.printStackTrace(); } //判斷熱點(diǎn)是否處于打開狀態(tài): try { Method method = wifiManager.getClass().getMethod("isWifiApEnabled"); method.setAccessible(true); return (Boolean) method.invoke(wifiManager); } catch (NoSuchMethodException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (Exception e) { e.printStackTrace(); } //關(guān)閉熱點(diǎn),先判斷熱點(diǎn)是否已被打開,是則關(guān)閉 if (isWifiApEnabled(wifiManager)) { 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); method2.invoke(wifiManager, config, false); }
到了這里安卓的wifi使用就已完成了,包括了wifi跟熱點(diǎn)兩大部分,wifi部分主要包括掃描、配置、連接斷開等,熱點(diǎn)部分主要是配置熱點(diǎn)信息并打開。
|