我的大学有一个开放的 wifi 接入点,但是它要求您输入您的电子邮件,然后才能使用网络。我的问题是 Wifi 很愚蠢,因为它似乎断开了我的连接并迫使我每 10 分钟再次输入我的电子邮件。
我想创建自己的应用程序,我可以使用它来自动为我执行此步骤,但我似乎找不到任何文档来检测 Wifi 接入点是否具有浏览器登录页面。Android 中有没有办法获取这些信息,或者只是看看我与某物的连接是否总是重定向到 1.1.1.1?
我的大学有一个开放的 wifi 接入点,但是它要求您输入您的电子邮件,然后才能使用网络。我的问题是 Wifi 很愚蠢,因为它似乎断开了我的连接并迫使我每 10 分钟再次输入我的电子邮件。
我想创建自己的应用程序,我可以使用它来自动为我执行此步骤,但我似乎找不到任何文档来检测 Wifi 接入点是否具有浏览器登录页面。Android 中有没有办法获取这些信息,或者只是看看我与某物的连接是否总是重定向到 1.1.1.1?
请参阅HttpUrlConnection
文档的“处理网络登录”部分:
某些 Wi-Fi 网络会阻止 Internet 访问,直到用户单击登录页面。此类登录页面通常使用 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 并检查主机更好的答案,因为即使显示重定向页面,主机也不总是改变。例如,我在 Belkin 路由器上进行了测试,它保留了您在浏览器中键入的内容,但仍显示自己的页面。urlConnection.getUrl().getHost() 因此返回它应该返回的内容。
我认为@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,因为广播接收器的生命周期很短。
我使用谷歌的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 连接。
我没有尝试过,但也许使用sCAPTIVE_PORTAL_CHECK
的枚举值可以尝试正确检测这种模式?NetworkInfo
DetailedState