那些我们解过的bug之WiFi连接后可以正常使用,但是提示已连接,但无法访问网络

问题描述

1.进入设置-网络互联网
2.开启WiFi,选择Ap连接
wifi连接成功,能够正常上网,但是提示:已连接,但无法访问互联网

问题分析

这个从现象来看,应该是提示错误。

那我们就看看代码中提示的位置吧。

frameworks/base/packages/SettingsLib/res/values-zh-rCN/strings.xml:42:    
<string name="wifi_connected_no_internet" msgid="3149853966840874992">"已连接,但无法访问互联网"</string>

packages/SettingsLib/res/values/strings.xml:98:    
<string name="wifi_connected_no_internet">Connected, no Internet</string>

frameworks/base/packages/SettingsLib/src/com/android/settingslib/wifi/AccessPoint.java

else if (!nc.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED)) {
   return context.getString(R.string.wifi_connected_no_internet);
}          

问题解决

我先搜索了一下MTK的FAQ,找到二个相关的说明:

[FAQ18184] [Legacy Wi-Fi][M]每次连接上网络会提示“已连接无法访问互联网”几秒钟后消失
[FAQ19267] wifi: 连接网络时提示“已连接无法访问互联网”几秒钟后消失

MTK的解释是说,由于手机会连接网站—–connectivitycheck.gstatic.com,如果有得到200, 就代表有Internet能力,但是我们国家连此网站不上,所以才导致此问题。

所以MTK给的解决方法:

M版本:
 若希望不显示"已连接无法访问互联网"这个提示,可参照如下方法进行修改:
 修改DefaultWifiLibExt.java的shouldCheckNetworkCapabilities函数,将return true;修改为return false。

N版本:
在DefaultWifiLibExt.java中仿照Op01WifiLibExt.java添加shouldCheckNetworkCapabilities函数,并返回fales;
修改AccessPoint.java的getSummary函数,在if (nc != null && !nc.hasCapability(nc.NET_CAPABILITY_VALIDATED)) 这个if语句中添加shouldCheckNetworkCapabilities条件
if (nc != null && !nc.hasCapability(nc.NET_CAPABILITY_VALIDATED) && AccessPointExt.getWifiPlugin(context).shouldCheckNetworkCapabilities())

但是,我的手机版本是android 8.1.0,我搜索项目代码,根本就找不到DefaultWifiLibExt.java和shouldCheckNetworkCapabilities方法。

于是,我咨询了一下朋友,朋友告诉我说修改这个的默认值为0:
frameworks/base/packages/SettingsProvider/res/values/defaults.xml

<!-- Default for Settings.Global.CAPTIVE_PORTAL_DETECTION_ENABLED -->
<integer name="def_captive_portal_detection_enabled" translatable="false">0</integer>

于是,我将此值设置为0,编译验证,问题解决。

问题倒推

在frameworks/base/packages/SettingsProvider/src/com/android/providers/settings/DatabaseHelper.java文件中,读取初始值def_captive_portal_detection_enabled:

loadIntegerSetting(stmt, Settings.Global.CAPTIVE_PORTAL_MODE,R.integer.def_captive_portal_detection_enabled);

在frameworks/base/services/core/java/com/android/server/connectivity/NetworkMonitor.java文件中读取CAPTIVE_PORTAL_MODE值:

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

使用此值mIsCaptivePortalCheckEnabled的地方为:

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

        URL pacUrl = null;
        URL httpsUrl = mCaptivePortalHttpsUrl;
        URL httpUrl = mCaptivePortalHttpUrl;
        ..................
}

再搜索mCaptivePortalHttpUrl:

mCaptivePortalHttpUrl = makeURL(getCaptivePortalServerHttpUrl(context));

再搜索getCaptivePortalServerHttpUrl方法:

public static String getCaptivePortalServerHttpUrl(Context context) {
    return getSetting(context, Settings.Global.CAPTIVE_PORTAL_HTTP_URL, DEFAULT_HTTP_URL);
}

再搜索DEFAULT_HTTP_URL:

private static final String DEFAULT_HTTP_URL      =
            "http://connectivitycheck.gstatic.com/generate_204";

与MTK描述的一致,至此,问题解决。

猜你喜欢

转载自blog.csdn.net/hfreeman2008/article/details/81292083