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

Android-检测Wifi是否需要浏览器登录,android,wifi,android-wifi,Android,Wifi,Android Wifi,我的大学有一个开放的wifi接入点,但是它要求你在允许你使用网络之前输入你的电子邮件。我的问题是Wifi很愚蠢,它似乎会中断我的连接,迫使我每隔10分钟重新输入一次电子邮件 我想创建我自己的应用程序,我可以用它来自动完成这一步骤,但我似乎找不到任何文档来提供一种简单的方法来检测Wifi接入点是否有浏览器登录页面。Android中是否有办法获取此信息,或者只是为了查看我与某个设备的连接是否总是重定向到1.1.1.1?请参阅以下内容的“处理网络登录”部分: 一些Wi-Fi网络在用户点击登录页面之前会

我的大学有一个开放的wifi接入点,但是它要求你在允许你使用网络之前输入你的电子邮件。我的问题是Wifi很愚蠢,它似乎会中断我的连接,迫使我每隔10分钟重新输入一次电子邮件

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

请参阅以下内容的“处理网络登录”部分:

一些Wi-Fi网络在用户点击登录页面之前会阻止互联网访问。这种登录页面通常通过使用HTTP重定向来显示。您可以使用getURL()测试连接是否被意外重定向。此检查在收到响应标头之前无效,您可以通过调用getHeaderFields()或getInputStream()触发响应标头


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

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接入点上没有互联网连接时,这也表明需要进行网络登录


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

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


我还没有尝试过,但是可以使用
NetworkInfo
s的enum值
CAPTIVE\u PORTAL\u CHECK
,尝试正确检测这种模式

我认为@Fleel走的是正确的道路,但我会使用,如果你没有204,你知道你在一个俘虏门户后面。您可以在一个循环中运行此操作,直到获得204,在这种情况下,您知道您不再支持捕获门户

@飞轮写道:唯一的缺点是,这也意味着当WiFi接入点上根本没有互联网连接时,需要进行网络登录

您可以通过将接收器注册到android.net.conn.CONNECTIVITY\u 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.
   }
}

我不记得请求状态是否已完成或关联,您必须检查它。您应该使用IntentService来检查generate_204,因为广播接收器的生命周期很短。

我使用google的
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在内的许多应用程序都使用它来验证连接是否在captive portal下被锁定。

向Google.com发送一个HTTP请求,看看会发生什么。我实现了这一点,当重定向更改主机名时,它能很好地工作,但有些没有。例如,此Belkin路由器保留您在浏览器中键入的内容,但仍显示其自己的页面。因此,urlConnection.getUrl().getHost()返回它应该返回的内容。在这种情况下有什么建议吗?Android如何检测自身的连通性?例如,橙色和白色的Wifi/数据图标。没有其他方法验证这一点吗?这种方法容易出错。例如@Flyview所描述的内容。他下面的方法也容易出错(见下面对答案的评论)。@NeTeInStEiN:“这种方法容易出错”——我想这取决于具体情况。根据定义,一般来说,不可能处理Flyview的场景,因为来自该URL的捕获门户的
200 OK
响应与来自被点击的真实站点的
200 OK
响应是无法区分的(同样,一般而言)。使用HTTPS,您可以检查证书以确定它是否是正确的服务器,这应该是一个更明确的测试。@NeTeInStEiN Android有自己的门户检查代码,我最终使用了自己的代码。它从一个特殊的Google url检查重定向代码。查看我的帖子:@commonware这很容易出错,因为当WiFi连接但没有连接时,棒棒糖通过3G路由数据的新行为。因此,尽管在wifi登录页面上,您的请求不会有重定向(…因为您没有为他们使用wifi),但这也不能解决问题,因为当您连接时,您可能仍然需要登录,但过了一段时间后,您会通过网页登录,当您这样做时,您不会收到任何事件来警告您发生了变化,您需要再次测试您的连接…CAPTIVE_PORTAL_检查是一个瞬态,即使您连接到CAPTIVE Wifi,最终状态也将被连接。检查Capture Wifi的方法(对我来说是有效的)是尝试连接到一个网站,并检查您是否被重定向到另一个url。