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地址进行比较。如果它们不同,那么调用登录屏幕。这需要额外的权限,如果可能的话,我希望避免。如果你已经在使用访问权限,那么我认为这是一个很好的方法。