2012-08-14 78 views
15

我的大学有一个开放的WiFi接入点,但它要求您在允许您使用网络之前输入您的电子邮件。我的问题是,Wifi是愚蠢的,因为它似乎放弃我的连接,并迫使我每隔10分钟再次输入电子邮件。Android - 检测Wifi是否需要浏览器登录

我想创建我自己的应用程序,我可以使用它自动为我执行此步骤,但似乎无法找到任何文档,以便用于检测Wifi接入点是否具有浏览器登录页面的方便方法。有没有在Android的方式来获取这些信息,还是只是为了查看我的连接是否总是被重定向到1.1.1.1?

+0

向google.com发送HTTP请求,看看会发生什么。 – SLaks 2012-08-15 00:00:49

回答

15

the HttpUrlConnection documentation“处理网络登录”部分:

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

他们在那里有一段代码示例。无论这将覆盖你的特定WiFi AP,我不能说,但它是值得一试。

+1

我实现了这一点,当重定向改变主机名时,它很好地工作,但有些不这样。例如,这个Belkin路由器会保留原来在浏览器中输入的内容,但仍显示其自己的页面。 urlConnection.getUrl()。getHost()返回它应该因为这个。在这种情况下的任何建议? Android如何自行检测连接?即橙色vs白色Wifi /数据图标。 – Flyview 2014-08-16 16:53:57

+0

是否有任何其他方式来验证此?这种方法很容易出错。例如@Flyview所描述的。 他的方法也很容易出错(请参阅下面的答案评论)。 – neteinstein 2015-05-22 14:46:55

+0

@NeTeInStEiN:“这种方法很容易出错” - 我想这将取决于情况。根据定义,通常不可能处理Flyview的场景,因为URL的强制门户的'200 OK'响应与来自真实站点的'200 OK'响应无法区分(一般而言)。使用HTTPS,您可以检查证书以查看它是否是正确的服务器,这应该是一个更明确的测试。 – CommonsWare 2015-05-22 23:08:52

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接入点上根本没有互联网连接时需要网络登录。

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

+0

这也不能解决问题,因为当你连接你可能仍然需要登录,但一段时间后通过网页进行登录,当你这样做时,你没有收到任何事件来警告你某些事情已经改变了,以便再次测试你的连接性...... – neteinstein 2015-05-22 14:45:53

0

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

我还没有尝试过,但可能与枚举值CAPTIVE_PORTAL_CHECKNetworkInfo s DetailedState可以尝试正确检测这种模式?

+1

CAPTIVE_PORTAL_CHECK是一个瞬态状态,最终状态将被连接,即使你连接到一个Captive Wifi。检查Captive Wifi的方式(对我有用)是尝试连接到一个网站,并检查您是否被重定向到另一个网址。 – rsc 2017-07-12 08:58:00

1

我认为@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完成或关联,就必须检查。您应该使用IntentService来检查generate_204,因为广播接收器的寿命很短。