我在Android應用中使用HttpClient
4.1,並試圖讓我的應用的API請求被其中一個「您需要登錄或支付wifi」屏幕攔截的智能設備變得聰明。檢測並處理需要登錄的WiFi
我想彈出一個webview允許用戶登錄。
我一直在嘗試攔截httpClient中的重定向,但我不成功。
這是我目前想:
this.client = new DefaultHttpClient(connectionManager, params);
((DefaultHttpClient) this.client).setRedirectStrategy(new DefaultRedirectStrategy() {
public boolean isRedirected(HttpRequest request, HttpResponse response, HttpContext context) {
boolean isRedirect = Boolean.FALSE;
try {
isRedirect = super.isRedirected(request, response, context);
} catch (ProtocolException e) {
Log.e(TAG, "Failed to run isRedirected", e);
}
if (!isRedirect) {
int responseCode = response.getStatusLine().getStatusCode();
if (responseCode == 301 || responseCode == 302) {
throw new WifiLoginNeeded();
// The "real implementation" should return true here..
}
} else {
throw new WifiLoginNeeded();
}
return isRedirect;
}
});
然後在我的活動:
try {
response = httpClient.get(url);
} catch (WifiLoginNeeded e){
showWifiLoginScreen();
}
,其中顯示的wifi屏幕做到這一點:
Uri uri = Uri.parse("http://our-site.com/wifi-login");
Intent intent = new Intent(Intent.ACTION_VIEW, uri);
startActivity(intent);
的思考是這樣的:
- 我的API絕不會合法地重定向
- 所以我配置的HttpClient把我的特殊的RuntimeException當它重定向
- 捕獲了異常的活動代碼,並彈出一個網頁視圖,讓他們直接登錄屏幕
- 一旦他們登錄,wifi登錄祝賀他們做得好,並提示他們回到應用程序
事情是,我從來沒有得到該WifiLoginNeeded異常。使用Android完成此操作的首選方法是什麼?
首先,確保你的http服務器返回正確的httpReponse(301或302)。 – yorkw 2012-03-27 02:48:19
事情是,這不是我的服務器做重定向。這是WiFi接入點之一,它將所有內容指向他們的「登錄到我們昂貴的WiFi」頁面。所以我需要抓住每個我們可以想到的重定向HTTP調用的情況。 – 2012-03-27 13:46:25
它甚至可能不是您所期望的重定向類型 - 也請確保您所期望的代碼正在生成。接入點不必返回您期望的特定HTTP代碼,它可能會愉快地發送一個[200]指示您在接入點登錄屏幕時一切正常。 您可能希望存儲您的站點的IP地址,並將其與最新的http請求返回的IP地址進行比較。如果它們不同,請調出登錄屏幕。 – RightHandedMonkey 2012-08-29 23:41:18