Android 11 引入了一种新的方式来检测门户,即通过检测网络连接状态的变化。在离线场景下,设备无法直接访问门户网站,因此无法判断当前网络是否存在门户。针对这种情况,我们可以采用以下方法来进行处理:
在离线场景下,当设备从移动网络切换到 WiFi 网络时,可能会出现检测不到门户的情况。因此,我们需要在连接 WiFi 之后等待一段时间,以确保门户已经能够访问。
示例代码:
private static final long WIFI_CONNECTION_TIMEOUT_MS = 60_000;
private Handler mHandler; private Runnable mTimeoutRunnable = new Runnable() { @Override public void run() { // handle timeout } };
private void registerNetworkCallback() { ConnectivityManager cm = (ConnectivityManager) mContext.getSystemService(Context.CONNECTIVITY_SERVICE); NetworkRequest.Builder builder = new NetworkRequest.Builder(); builder.addCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET); builder.addCapability(NetworkCapabilities.NET_CAPABILITY_NOT_RESTRICTED); NetworkRequest request = builder.build(); cm.registerNetworkCallback(request, new ConnectivityManager.NetworkCallback() { @Override public void onAvailable(Network network) { if (isWifi(network)) { mHandler.postDelayed(mTimeoutRunnable, WIFI_CONNECTION_TIMEOUT_MS); } }
@Override
public void onLost(Network network) {
if (isWifi(network)) {
mHandler.removeCallbacks(mTimeoutRunnable);
}
}
});
}
如果设备此前曾经连接到过门户所在的网络,则可能会保存有网络缓存,可以通过读取缓存来进行检测。
示例代码:
private void detectPortalOffline() { try { HttpURLConnection urlConnection = (HttpURLConnection) new URL(PORTAL_URL).openConnection(); urlConnection.setRequestMethod("HEAD"); urlConnection.setInstanceFollowRedirects(false);
int responseCode = urlConnection.getResponseCode();
if (responseCode == HttpURLConnection.HTTP_NO_CONTENT) {
// portal not detected
} else if (responseCode == HttpURLConnection.HTTP_MOVED_TEMP) {
// portal detected
} else {
// error
}
} catch (IOException e) {
// error
}
}
门户网址