English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
تفسير عمليات forget() لـ Android Wi-Fi
في معالجة اتصال Wi-Fi معين، في بعض الأحيان قد نحتاج إلى نسيان معلومات كلمة المرور الحالية للاتصال. لإجراء هذه العملية، يجب علينا تنفيذ دالة 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، يعالج ClientHandler في WifiServiceImpl::
case WifiManager.FORGET_NETWORK: if (isOwner(msg.sendingUid)) { mWifiStateMachine.sendMessage(Message.obtain(msg)); } else { Slog.e(TAG, "ليس من المسموح للـ Forget للمستخدم"); 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); } //تحقق من أن المستخدم المتصل يمتلك هذه الشبكة 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) {}} //نجحنا لكن لا نريد إزالة الشبكة من ملف الإعدادات للطلب المقدم return true; } if (mWifiNative.removeNetwork(netId)) { if (config != null && config.isPasspoint()) { writePasspointConfigs(config.FQDN, null); } mWifiNative.saveConfig(); writeKnownNetworkHistory(true); return true; } else { loge("فشل في إزالة الشبكة " + netId); return false; } }
بناءً على netId الحالي المرسل، يتم استدعاء طرق removeNetwork() وsaveConfig() من WifiNative ل�除 المعلومات الخاصة بالإعدادات في ملف conf و حفظها، بعد إكمال التنفيذ، تنتهي وظيفة forget(). من خلال الكود نجد أن تنفيذ وظيفة forget() لن يؤدي إلى تغيير حالة WifiStateMachine.
شكراً على القراءة، آمل أن يساعدكم هذا، شكراً لدعمكم للموقع!
بيان: محتوى هذا المقال تم جمعه من الإنترنت، ويتمتع المالك الأصلي بحقوق الطبع والنشر، ويتم جمعه من قبل المستخدمين على الإنترنت الذين يقدمون المساهمات بشكل متعاوني ويتم تحميله بشكل مستقل، ويتمتع الموقع غير الحقوقي، ولا يتم تعديل المحتوى بشكل يدوي، ولا يتحمل أي مسؤولية قانونية متعلقة بذلك. إذا كنت قد وجدت محتوى يشتبه في انتهاك حقوق النسخ، فلا تتردد في إرسال بريد إلكتروني إلى: notice#oldtoolbag.com (عند إرسال البريد الإلكتروني، يرجى استبدال # ب @) لإبلاغنا، وتقديم الدليل المتعلق، وستقوم الموقع فوراً بإزالة المحتوى المزعوم.