Android - 检测 Wifi 是否需要浏览器登录

问题描述 投票:0回答:6

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

我想创建自己的应用程序,我可以用它来自动执行此步骤,但我似乎找不到任何文档来提供一种简单易用的方法来检测 Wifi 接入点是否有浏览器登录页面。 Android 中有没有办法获取此信息,或者只是查看我与某些内容的连接是否始终重定向到 1.1.1.1?

android wifi android-wifi
6个回答
17
投票

请参阅

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

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

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


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 并检查主机更好的答案,因为即使显示重定向页面,主机也并不总是更改。例如,我在贝尔金路由器上进行了测试,它会保留您在浏览器中输入的任何内容,但仍显示其自己的页面。因此 urlConnection.getUrl().getHost() 返回它应该返回的内容。


2
投票

我认为@FlyWheel走在正确的道路上,但我会使用http://clients1.google.com/generate_204,如果你没有得到204,你就知道你在一个强制门户后面。您可以循环运行此命令,直到收到 204,在这种情况下您就知道您不再处于强制门户后面了。

@FlyWheel 写道: 唯一的缺点是,当 WiFi 接入点上根本没有互联网连接时,这也表明需要 Web 登录。

您可以通过向 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,因为广播接收器的生命周期很短。


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 来验证连接是否未在强制门户下锁定。


0
投票

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

我还没有尝试过,但也许可以使用

CAPTIVE_PORTAL_CHECK
s
NetworkInfo
 的枚举值 
DetailedState
来尝试正确检测这种模式?


0
投票

谢谢你,我从中受益匪浅 [https://eshraag.com/][1]

© www.soinside.com 2019 - 2024. All rights reserved.