Android 检测并处理需要登录wifi的情况
我正在安卓应用程序中使用Android 检测并处理需要登录wifi的情况,android,httpclient,wifi,Android,Httpclient,Wifi,我正在安卓应用程序中使用HttpClient4.1,并试图让我的应用程序的API请求被其中一个“您需要登录或支付wifi”屏幕截获 我想弹出一个允许用户登录的网络视图 我一直试图在httpClient中拦截重定向,但没有成功 这就是我目前正在尝试的: this.client = new DefaultHttpClient(connectionManager, params); ((DefaultHttpClient) this.client).setRedirectStrategy(new D
HttpClient
4.1,并试图让我的应用程序的API请求被其中一个“您需要登录或支付wifi”屏幕截获
我想弹出一个允许用户登录的网络视图
我一直试图在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
- 在“活动代码”中捕获该异常,并弹出一个Webview以将其定向到登录屏幕
- 一旦他们登录,wifi登录会祝贺他们工作出色,并提示他们返回应用程序
问题是,我从来没有得到过Wifilogineed的例外。用Android实现这一点的首选方法是什么?请检查以下代码。检查您正在使用的连接类型可能对您很有用
WifiManager lWifiManager = (WifiManager) OpenYouTubePlayerActivity.this.getSystemService(Context.WIFI_SERVICE);
TelephonyManager lTelephonyManager = (TelephonyManager) OpenYouTubePlayerActivity.this.getSystemService(Context.TELEPHONY_SERVICE);
////////////////////////////
// if we have a fast connection (wifi or 3g)
if( (lWifiManager.isWifiEnabled() && lWifiManager.getConnectionInfo() != null && lWifiManager.getConnectionInfo().getIpAddress() != 0) ||
( (lTelephonyManager.getNetworkType() == TelephonyManager.NETWORK_TYPE_UMTS ||
/* icky... using literals to make backwards compatible with 1.5 and 1.6 */
lTelephonyManager.getNetworkType() == 9 /*HSUPA*/ ||
lTelephonyManager.getNetworkType() == 10 /*HSPA*/ ||
lTelephonyManager.getNetworkType() == 8 /*HSDPA*/ ||
lTelephonyManager.getNetworkType() == 5 /*EVDO_0*/ ||
lTelephonyManager.getNetworkType() == 6 /*EVDO A*/)
&& lTelephonyManager.getDataState() == TelephonyManager.DATA_CONNECTED)
){
//Do some thing here
}
试试这个小办法,它会有帮助的
public boolean haveNetworkConnection() {
cm = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE);
Boolean haveConnectedWifi = false;
Boolean haveConnectedMobile = false;
NetworkInfo[] netInfo = cm.getAllNetworkInfo();
for (NetworkInfo ni : netInfo) {
if (ni.getTypeName().equalsIgnoreCase("WIFI"))
if (ni.isConnected())
haveConnectedWifi = true;
if (ni.getTypeName().equalsIgnoreCase("MOBILE"))
if (ni.isConnected())
haveConnectedMobile = true;
}
return haveConnectedWifi || haveConnectedMobile;
}
更一般的情况是:您可以在公共API中包含诸如“helloworld”或“Ping”消息之类的内容
GET http://api.example.com/1.0/ping HTTP/1.1
Accepts: text/json
Content-Type: text/json
{ ping: "ok", currentAPIVersion: 1.1, minAPIVersion: 1.0 }
尝试连接并“ping”服务器。如果响应没有以您期望的格式返回,则抛出相同的URL作为用户使用其选择的web浏览器处理结果的意图
这还将处理:公司代理(“XYZ公司禁止您!”),以及将来您自己的API中不兼容的更改(“对不起,我们不再支持12年前的API版本。请在那里下载更新。”)首先,确保您的http服务器返回正确的httpReponse(301或302)。问题是,重定向的不是我的服务器。它是其中一个WiFi接入点,将所有内容指向他们的“登录我们昂贵的WiFi”页面。所以我需要抓住我们能想到的每一种重定向HTTP调用的情况。它甚至可能不是您所期望的重定向类型-还要确保生成了您所期望的代码。接入点不必返回您期望的特定HTTP代码,它可能会愉快地发送一个[200],指示一切正常,同时将您引导到其接入点登录屏幕。您可能希望存储站点的ip地址,并将其与最新http请求返回的ip地址进行比较。如果它们不同,那么调用登录屏幕。这需要额外的权限,如果可能的话,我希望避免。如果你已经在使用访问权限,那么我认为这是一个很好的方法。