2012-08-14 28 views
15

我的大學有一個開放的WiFi接入點,但它要求您在允許您使用網絡之前輸入您的電子郵件。我的問題是,Wifi是愚蠢的,因爲它似乎放棄我的連接,並迫使我每隔10分鐘再次輸入電子郵件。Android - 檢測Wifi是否需要瀏覽器登錄

我想創建我自己的應用程序,我可以使用它自動爲我執行此步驟,但似乎無法找到任何文檔,以便用於檢測Wifi接入點是否具有瀏覽器登錄頁面的方便方法。有沒有在Android的方式來獲取這些信息,還是隻是爲了查看我的連接是否總是被重定向到1.1.1.1?

+0

向google.com發送HTTP請求,看看會發生什麼。 – SLaks 2012-08-15 00:00:49

回答

15

the HttpUrlConnection documentation「處理網絡登錄」部分:

一些Wi-Fi網絡禁止訪問Internet,直到用戶點擊通過一個登錄頁面。這種登錄頁面通常通過使用HTTP重定向來呈現。您可以使用getURL()來測試您的連接是否被意外重定向。只有在接收到響應標頭之後,此檢查纔有效,您可以通過調用getHeaderFields()或getInputStream()來觸發該響應標頭。

他們在那裏有一段代碼示例。無論這將覆蓋你的特定WiFi AP,我不能說,但它是值得一試。

+1

我實現了這一點,當重定向改變主機名時,它很好地工作,但有些不這樣。例如,這個Belkin路由器會保留原來在瀏覽器中輸入的內容,但仍顯示其自己的頁面。 urlConnection.getUrl()。getHost()返回它應該因爲這個。在這種情況下的任何建議? Android如何自行檢測連接?即橙色vs白色Wifi /數據圖標。 – Flyview 2014-08-16 16:53:57

+0

是否有任何其他方式來驗證此?這種方法很容易出錯。例如@Flyview所描述的。 他的方法也很容易出錯(請參閱下面的答案評論)。 – neteinstein 2015-05-22 14:46:55

+0

@NeTeInStEiN:「這種方法很容易出錯」 - 我想這將取決於情況。根據定義,通常不可能處理Flyview的場景,因爲URL的強制門戶的'200 OK'響應與來自真實站點的'200 OK'響應無法區分(一般而言)。使用HTTPS,您可以檢查證書以查看它是否是正確的服務器,這應該是一個更明確的測試。 – CommonsWare 2015-05-22 23:08:52

3

Ping一個外部IP地址(如google.com)以查看它是否響應。

try { 
     Runtime runtime = Runtime.getRuntime(); 
     Process proc = runtime.exec("ping -c 1 " + "google.com"); 
     proc.waitFor();  
     int exitCode = proc.exitValue(); 
     if(exitCode == 0) { 
      Log.d("Ping", "Ping successful!"; 
     } else { 
      Log.d("Ping", "Ping unsuccessful."); 
     } 
    } 
    catch (IOException e) {} 
    catch (InterruptedException e) {} 

唯一的缺點是這也意味着在WiFi接入點上根本沒有互聯網連接時需要網絡登錄。

@CommonsWare我相信這比打開UrlConnection和檢查主機更好,因爲即使顯示重定向頁面,主機並不總是改變。例如,我在Belkin路由器上進行了測試,它將原樣保留在瀏覽器中的任何內容都保留下來,但仍顯示其自己的頁面。 urlConnection.getUrl()。getHost()返回它應該因爲這個。

+0

這也不能解決問題,因爲當你連接你可能仍然需要登錄,但一段時間後通過網頁進行登錄,當你這樣做時,你沒有收到任何事件來警告你某些事情已經改變了,以便再次測試你的連接性...... – neteinstein 2015-05-22 14:45:53

0

這個問題可能是 - 至少在今天 - 更新的Android版本(5.1+?)保持3G/4G連接並運行,直到wifi登錄實際上導致功能完整的wifi連接。

我還沒有嘗試過,但可能與枚舉值CAPTIVE_PORTAL_CHECKNetworkInfo s DetailedState可以嘗試正確檢測這種模式?

+1

CAPTIVE_PORTAL_CHECK是一個瞬態狀態,最終狀態將被連接,即使你連接到一個Captive Wifi。檢查Captive Wifi的方式(對我有用)是嘗試連接到一個網站,並檢查您是否被重定向到另一個網址。 – rsc 2017-07-12 08:58:00

1

我認爲@FlyWheel是在正確的道路上,但我會使用http://clients1.google.com/generate_204,如果你沒有得到204,你就知道你是在一個強制門戶的後面。你可以循環運行,直到你得到204,在這種情況下,你知道你已經不在強制門戶後面了。

@FlyWheel寫道:唯一的缺點是這也表明,當WiFi接入點沒有互聯網連接時,需要網絡登錄。

你可以通過向android.net.conn.CONNECTIVITY_CHANGE註冊一個接收器來解決這個問題。您可以通過查看連接的請求者狀態來檢查Wifi是否打開並連接。

這裏是一個片段,但我沒有運行它:

WifiManager wm = (WifiManager) context.getSystemService(Context.WIFI_SERVICE); 
WifiInfo wifiInfo = wm.getConnectionInfo(); 
SupplicantState suppState = wifiInfo.getSupplicantState(); 

if (wm.isWifiEnabled()) { 
    if (suppState == SupplicantState.COMPLETED){ 
     // TODO - while loop checking generate_204 (FlyWheels code)Using intent service. 
    } 
} 

我不記得,如果SupplicantState完成或關聯,就必須檢查。您應該使用IntentService來檢查generate_204,因爲廣播接收器的壽命很短。