我的大学有一个开放的 WiFi 接入点,但它要求您输入电子邮件才能使用网络。我的问题是 Wifi 很愚蠢,它似乎会断开我的连接并迫使我每 10 分钟再次输入我的电子邮件。
我想创建自己的应用程序,我可以用它来自动执行此步骤,但我似乎找不到任何文档来提供一种简单易用的方法来检测 Wifi 接入点是否有浏览器登录页面。 Android 中有没有办法获取此信息,或者只是查看我与某些内容的连接是否始终重定向到 1.1.1.1?
HttpUrlConnection
文档的“处理网络登录”部分:
某些 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 接入点上根本没有互联网连接时,这也表明需要 Web 登录。
@CommonsWare 我相信这是比打开 UrlConnection 并检查主机更好的答案,因为即使显示重定向页面,主机也并不总是更改。例如,我在贝尔金路由器上进行了测试,它会保留您在浏览器中输入的任何内容,但仍显示其自己的页面。因此 urlConnection.getUrl().getHost() 返回它应该返回的内容。
我认为@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,因为广播接收器的生命周期很短。
我使用谷歌的
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 来验证连接是否未在强制门户下锁定。
问题可能是 - 至少在今天 - 较新的 Android 版本(5.1+?)保持 3G/4G 连接正常运行,直到 wifi 登录实际上导致功能齐全的 wifi 连接。
我还没有尝试过,但也许可以使用
CAPTIVE_PORTAL_CHECK
s NetworkInfo
的枚举值
DetailedState
来尝试正确检测这种模式?