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
<integer name="def_captive_portal_detection_enabled" translatable="false">0integer>
于是,我将此值设置为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描述的一致,至此,问题解决。