admin管理员组

文章数量:1530847

Android设备,连接可用的WiFi,提示“Connected, no Internet”怎么回事呢?(这个时候其实是可以上网的)

产生上面描述的这种现象是因为这个“Captive Portal”导致的。

Captive Portal 介绍

“Captive Portal “中文通常译作“强制主页”或“强制登录门户”。是一个登录Web页面,通常由网络运营商或网关在用户能够正常访问互联网之前拦截用户的请求并将一个强制登录或认证主页呈现(通常是通过浏览器)给用户。该页面可能要求用户输入认证信息、支付、接受某些条款或者其他用户授权等,随后用户才能被授权访问互联网。该技术广泛用于移动和个人宽带服务,包括有线电视、商业WiFi、家庭热点等,也可用于访问企业和住宅区有线网络。

作者:神农民
链接:https://www.jianshu/p/b4da31480f2c
來源:简书
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

那么Android是支持这个功能的。它的实现逻辑在NetWorkMonitor中。当一个网络连接建立时,系统将用该连接Ping一个Google的网站来判断该连接是否真的可以上网。我们知道,在大陆,有的网站是不能访问的,那么默认的Google的网站是不能正常访问的,导致能够连接上,能够访问网络,但是还是会提示”no Internet“。

下面结合代码进行简要的说明,和修改方法。

frameworks/base/services/core/java/com/android/server/connectivity/NetworkMonitor.java

    // Default configuration values for captive portal detection probes.
    // TODO: append a random length parameter to the default HTTPS url.
    // TODO: randomize browser version ids in the default User-Agent String.
    private static final String DEFAULT_HTTPS_URL     = "https://www.google/generate_204";
    private static final String DEFAULT_HTTP_URL      =
            "http://connectivitycheck.gstatic/generate_204";
    private static final String DEFAULT_FALLBACK_URL  = "http://www.google/gen_204";

原生代码中提供的网址来判断是否正的可以上网。修改这个网址为在大陆可以访问的网址就可以修复这个问题。你可以试试。

还有一种修改方法:

frameworks/base/services/core/java/com/android/server/connectivity/NetworkMonitor.java
protected boolean mIsCaptivePortalCheckEnabled;

mIsCaptivePortalCheckEnabled = Settings.Global.getInt(mContext.getContentResolver(),
        Settings.Global.CAPTIVE_PORTAL_MODE, Settings.Global.CAPTIVE_PORTAL_MODE_PROMPT)
         != Settings.Global.CAPTIVE_PORTAL_MODE_IGNORE;


protected CaptivePortalProbeResult isCaptivePortal() {
    if (!mIsCaptivePortalCheckEnabled) {
        validationLog("Validation disabled.");
        return new CaptivePortalProbeResult(204);
    }

根据代码逻辑,通过一个标志位mIsCaptivePortalCheckEnabled来判断是否进行判断当前网络是否可以上网。那么可以将该flag设置为False即可解决这个问题了。

本文标签: 解决方案原因wifiandroidinternet