国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 系統 > Android > 正文

Android Wifi的forget()操作實例詳解

2019-10-23 19:46:32
字體:
來源:轉載
供稿:網友

Android  Wifi的forget()操作實例詳解

我們在處理某個Wifi連接時,有時會需要忘掉當前連接的密碼信息。執行這項操作,我們需要調用WifiManager::forget()函數:

/**  * 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)); } 

從函數介紹可知,調用forget()函數,當前網絡連接的配置信息就會從wpa_supplicant.conf中刪掉;之后這個網絡就不會有自動重連的動作,因為conf文件中已經沒有該網絡的配置信息。

跟蹤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; 

簡單地將該消息轉發給WifiStateMachine。此時Wifi是連接狀態,WifiStateMachine中當前狀態是ConnectedState,它的父狀態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;   } } 

根據傳入的當前網絡的netId,分別調用WifiNative的removeNetwork()、saveConfig()方法刪除conf文件的配置信息并進行保存;執行完成后,forget()函數結束了。通過代碼我們發現,執行forget()函數并不會引起WifiStateMachine中狀態的切換。

感謝閱讀,希望能幫助到大家,謝謝大家對本站的支持!


注:相關教程知識閱讀請移步到Android開發頻道。
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 桂东县| 姚安县| 衡南县| 潜江市| 田阳县| 蛟河市| 左云县| 肇东市| 巨鹿县| 镇巴县| 红安县| 达州市| 安西县| 丹棱县| 崇义县| 阿城市| 紫阳县| 益阳市| 凉山| 石景山区| 八宿县| 崇左市| 武平县| 太康县| 长治县| 湟源县| 尉犁县| 西贡区| 巫溪县| 屯门区| 金湖县| 浦江县| 射洪县| 嘉义市| 乌鲁木齐县| 塔城市| 阿拉善右旗| 丹巴县| 龙州县| 金塔县| 盐山县|