16

我的大学有一个开放的 wifi 接入点,但是它要求您输入您的电子邮件,然后才能使用网络。我的问题是 Wifi 很愚蠢,因为它似乎断开了我的连接并迫使我每 10 分钟再次输入我的电子邮件。

我想创建自己的应用程序,我可以使用它来自动为我执行此步骤,但我似乎找不到任何文档来检测 Wifi 接入点是否具有浏览器登录页面。Android 中有没有办法获取这些信息,或者只是看看我与某物的连接是否总是重定向到 1.1.1.1?

4

5 回答 5

16

请参阅HttpUrlConnection文档的“处理网络登录”部分:

某些 Wi-Fi 网络会阻止 Internet 访问,直到用户单击登录页面。此类登录页面通常使用 HTTP 重定向来呈现。您可以使用 getURL() 来测试您的连接是否被意外重定向。此检查在收到响应标头后才有效,您可以通过调用 getHeaderFields() 或 getInputStream() 来触发。

他们在那里有一段示例代码。这是否会覆盖您的特定 WiFi AP,我不能说,但值得一试。

于 2012-08-15T00:06:44.080 回答
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 接入点上根本没有互联网连接时,这也表明需要 Web 登录。

@CommonsWare 我相信这是一个比打开 UrlConnection 并检查主机更好的答案,因为即使显示重定向页面,主机也不总是改变。例如,我在 Belkin 路由器上进行了测试,它保留了您在浏览器中键入的内容,但仍显示自己的页面。urlConnection.getUrl().getHost() 因此返回它应该返回的内容。

于 2014-08-16T17:36:57.010 回答
2

我认为@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 是 COMPLETED 还是 ASSOCIATED,你必须检查一下。您应该使用 IntentService 来检查 generate_204,因为广播接收器的生命周期很短。

于 2016-09-01T22:05:00.177 回答
1

我使用谷歌的204端点使用了以下代码。

 private boolean networkAvailable() {

        ConnectivityManager mManager = (ConnectivityManager) getApplicationContext().getSystemService(Context.CONNECTIVITY_SERVICE);
        if(mManager != null) {
            NetworkInfo activeNetwork = mManager.getActiveNetworkInfo();
            if(activeNetwork== null || !activeNetwork.isConnectedOrConnecting()){
                return false;
            }
        }

        OkHttpClient client = new OkHttpClient();

        Request request = new Request.Builder()
                .url("http://clients1.google.com/generate_204")
                .build();
        try {
            Response response = client.newCall(request).execute();
            if(response.code() != 204)
                return  false; // meaning it either responded with a captive html page or did a redirection to captive portal.
            return true;
        } catch (IOException e) {
            return true;
        }
    }

包括 Google Chrome 在内的许多应用程序都使用http://clients1.google.com/generate_204来验证连接未在强制门户下锁定。

于 2019-06-25T11:21:32.667 回答
0

问题可能是 - 至少在今天 - 较新的 Android 版本(5.1+?)保持 3G/4G 连接正常运行,直到 wifi 登录实际上导致功能齐全的 wifi 连接。

我没有尝试过,但也许使用sCAPTIVE_PORTAL_CHECK的枚举值可以尝试正确检测这种模式?NetworkInfoDetailedState

于 2016-05-19T10:57:04.017 回答