Android設備,連接可用的WiFi,提示“Connected, no Internet”怎麼回事呢?(這個時候其實是可以上網的)
產生上面描述的這種現象是因爲這個“Captive Portal”導致的。
Captive Portal 介紹
“Captive Portal “中文通常譯作“強制主頁”或“強制登錄門戶”。是一個登錄Web頁面,通常由網絡運營商或網關在用戶能夠正常訪問互聯網之前攔截用戶的請求並將一個強制登錄或認證主頁呈現(通常是通過瀏覽器)給用戶。該頁面可能要求用戶輸入認證信息、支付、接受某些條款或者其他用戶授權等,隨後用戶才能被授權訪問互聯網。該技術廣泛用於移動和個人寬帶服務,包括有線電視、商業WiFi、家庭熱點等,也可用於訪問企業和住宅區有線網絡。
作者:神農民
鏈接:https://www.jianshu.com/p/b4da31480f2c
來源:簡書
著作權歸作者所有。商業轉載請聯繫作者獲得授權,非商業轉載請註明出處。
那麼Android是支持這個功能的。它的實現邏輯在NetWorkMonitor中。當一個網絡連接建立時,系統將用該連接Ping一個Google的網站來判斷該連接是否真的可以上網。我們知道,在大陸,有的網站是不能訪問的,那麼默認的Google的網站是不能正常訪問的,導致能夠連接上,能夠訪問網絡,但是還是會提示”no Internet“。
下面結合代碼進行簡要的說明,和修改方法。
frameworks/base/services/core/java/com/android/server/connectivity/NetworkMonitor.java
// Default configuration values for captive portal detection probes.
// TODO: append a random length parameter to the default HTTPS url.
// TODO: randomize browser version ids in the default User-Agent String.
private static final String DEFAULT_HTTPS_URL = "https://www.google.com/generate_204";
private static final String DEFAULT_HTTP_URL =
"http://connectivitycheck.gstatic.com/generate_204";
private static final String DEFAULT_FALLBACK_URL = "http://www.google.com/gen_204";
原生代碼中提供的網址來判斷是否正的可以上網。修改這個網址爲在大陸可以訪問的網址就可以修復這個問題。你可以試試。
還有一種修改方法:
frameworks/base/services/core/java/com/android/server/connectivity/NetworkMonitor.java
protected boolean mIsCaptivePortalCheckEnabled;
mIsCaptivePortalCheckEnabled = Settings.Global.getInt(mContext.getContentResolver(),
Settings.Global.CAPTIVE_PORTAL_MODE, Settings.Global.CAPTIVE_PORTAL_MODE_PROMPT)
!= Settings.Global.CAPTIVE_PORTAL_MODE_IGNORE;
protected CaptivePortalProbeResult isCaptivePortal() {
if (!mIsCaptivePortalCheckEnabled) {
validationLog("Validation disabled.");
return new CaptivePortalProbeResult(204);
}
根據代碼邏輯,通過一個標誌位mIsCaptivePortalCheckEnabled來判斷是否進行判斷當前網絡是否可以上網。那麼可以將該flag設置爲False即可解決這個問題了。