Android Wifi的forget()操作實(shí)例詳解
Android Wifi的forget()操作實(shí)例詳解
我們在處理某個Wifi連接時,有時會需要忘掉當(dāng)前連接的密碼信息。執(zhí)行這項(xiàng)操作,我們需要調(diào)用WifiManager::forget()函數(shù):
/** * Delete the network in the supplicant config. * * This function is used instead of a sequence of removeNetwork() * and saveConfiguration(). * * @param config the set of variables that describe the configuration, * contained in a {@link WifiConfiguration} object. * @param listener for callbacks on success or failure. Can be null. * @throws IllegalStateException if the WifiManager instance needs to be * initialized again * @hide */ public void forget(int netId, ActionListener listener) { if (netId < 0) throw new IllegalArgumentException("Network id cannot be negative"); validateChannel(); sAsyncChannel.sendMessage(FORGET_NETWORK, netId, putListener(listener)); }
從函數(shù)介紹可知,調(diào)用forget()函數(shù),當(dāng)前網(wǎng)絡(luò)連接的配置信息就會從wpa_supplicant.conf中刪掉;之后這個網(wǎng)絡(luò)就不會有自動重連的動作,因?yàn)閏onf文件中已經(jīng)沒有該網(wǎng)絡(luò)的配置信息。
跟蹤FORGET_NETWORK消息,WifiServiceImpl::ClientHandler處理:
case WifiManager.FORGET_NETWORK: if (isOwner(msg.sendingUid)) { mWifiStateMachine.sendMessage(Message.obtain(msg)); } else { Slog.e(TAG, "Forget is not authorized for user"); replyFailed(msg, WifiManager.FORGET_NETWORK_FAILED, WifiManager.NOT_AUTHORIZED); } break;
簡單地將該消息轉(zhuǎn)發(fā)給WifiStateMachine。此時Wifi是連接狀態(tài),WifiStateMachine中當(dāng)前狀態(tài)是ConnectedState,它的父狀態(tài)ConnectModeState處理:
case WifiManager.FORGET_NETWORK: // Debug only, remember last configuration that was forgotten WifiConfiguration toRemove = mWifiConfigStore.getWifiConfiguration(message.arg1); if (toRemove == null) { lastForgetConfigurationAttempt = null; } else { lastForgetConfigurationAttempt = new WifiConfiguration(toRemove); } // check that the caller owns this network netId = message.arg1; if (!mWifiConfigStore.canModifyNetwork(message.sendingUid, netId, /* onlyAnnotate */ false)) { logw("Not authorized to forget network " + " cnid=" + netId + " uid=" + message.sendingUid); replyToMessage(message, WifiManager.FORGET_NETWORK_FAILED, WifiManager.NOT_AUTHORIZED); break; } if (mWifiConfigStore.forgetNetwork(message.arg1)) { replyToMessage(message, WifiManager.FORGET_NETWORK_SUCCEEDED); broadcastWifiCredentialChanged(WifiManager.WIFI_CREDENTIAL_FORGOT, (WifiConfiguration) message.obj); } else { loge("Failed to forget network"); replyToMessage(message, WifiManager.FORGET_NETWORK_FAILED, WifiManager.ERROR); } break;
mWifiConfigStore.forgetNetwork():
/** * Forget the specified network and save config * * @param netId network to forget * @return {@code true} if it succeeds, {@code false} otherwise */ boolean forgetNetwork(int netId) { if (showNetworks) localLog("forgetNetwork", netId); WifiConfiguration config = mConfiguredNetworks.get(netId); boolean remove = removeConfigAndSendBroadcastIfNeeded(netId); if (!remove) { //success but we dont want to remove the network from supplicant conf file return true; } if (mWifiNative.removeNetwork(netId)) { if (config != null && config.isPasspoint()) { writePasspointConfigs(config.FQDN, null); } mWifiNative.saveConfig(); writeKnownNetworkHistory(true); return true; } else { loge("Failed to remove network " + netId); return false; } }
根據(jù)傳入的當(dāng)前網(wǎng)絡(luò)的netId,分別調(diào)用WifiNative的removeNetwork()、saveConfig()方法刪除conf文件的配置信息并進(jìn)行保存;執(zhí)行完成后,forget()函數(shù)結(jié)束了。通過代碼我們發(fā)現(xiàn),執(zhí)行forget()函數(shù)并不會引起WifiStateMachine中狀態(tài)的切換。
感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!
- Android wifi 調(diào)試詳解及簡單實(shí)例
- Android 如何查看Wifi密碼
- Android判斷wifi是5G還是2.4G
- 通過WIFI(不用數(shù)據(jù)線)連接Android手機(jī)調(diào)試
- Android獲取當(dāng)前手機(jī)網(wǎng)絡(luò)類型(2g、3g、4g、wifi)以及手機(jī)型號、版本號代碼
- android編程實(shí)現(xiàn)設(shè)置、打開wifi熱點(diǎn)共享供他人連接的方法
- Android開發(fā)之Wifi基礎(chǔ)教程
- Android獲取當(dāng)前已連接的wifi信號強(qiáng)度的方法
- 在Android里完美實(shí)現(xiàn)基站和WIFI定位
相關(guān)文章
Android實(shí)現(xiàn)通話最小化懸浮框效果
本片內(nèi)容給大家介紹了Android音視頻通話過程中最小化成懸浮框的實(shí)現(xiàn)的方法以及代碼寫法。2017-11-11Android高效加載大圖、多圖解決方案 有效避免程序OOM
這篇文章主要為大家詳細(xì)介紹了Android高效加載大圖、多圖解決方案,有效避免程序OOM,具有一定的參考價值,感興趣的小伙伴們可以參考一下2016-10-10Android編程實(shí)現(xiàn)提取網(wǎng)址鏈接的方法
這篇文章主要介紹了Android編程實(shí)現(xiàn)提取網(wǎng)址鏈接的方法,涉及Android針對字符串的正則匹配操作相關(guān)技巧,需要的朋友可以參考下2016-10-10Android嚴(yán)苛模式StrictMode使用詳解
StrictMode類是Android 2.3 (API 9)引入的一個工具類,可以用來幫助開發(fā)者發(fā)現(xiàn)代碼中的一些不規(guī)范的問題,以達(dá)到提升應(yīng)用響應(yīng)能力的目的2018-01-01Android雙向選擇控件DoubleSeekBar使用詳解
這篇文章主要為大家詳細(xì)介紹了Android雙向選擇控件DoubleSeekBar的使用方法,文中示例代碼介紹的非常詳細(xì),具有一定的參考價值,感興趣的小伙伴們可以參考一下2020-08-08Android動畫 實(shí)現(xiàn)開關(guān)按鈕動畫(屬性動畫之平移動畫)實(shí)例代碼
這篇文章主要介紹了Android動畫 實(shí)現(xiàn)開關(guān)按鈕動畫(屬性動畫之平移動畫)實(shí)例代碼的相關(guān)資料,需要的朋友可以參考下2016-11-11