一、AndroidR WiFi可以上网,但是Settings里面提示“No Internet”。然后用设备的wifi连接到手机打开的热点不会有这样的提示。通过一翻折腾和了解现在android 增加一项检测网络性能的类NetworkCapabilities,通过这个类可以判断出网络的性能,但是默认是连接到Google的服务器,所以你懂的。

 二、NetworkCapabilities 类 frameworks\base\core\java\android\net\NetworkCapabilities.java

三、解决这个问题比较理想的方法是自己修改默认的网络服务器为国内的,但是找几天都找不到修改点,只能暂时放弃。但是问题又不能不解决,怎么办呢?那就用ping 国内ip的方法了吧。

四、通过Ping IP确认网络是否正常的步骤:

1、ping ip的java代码,通过waitFor()可以知道是否连接成功,成功返回0,失败为其他的值。实际上测试发现,刚刚连接wifi的时候,ping返回的是空的,waitFor()返回是2,等过几秒后才返回0,所有我这里把返回2也当成连接成功了。

private boolean CheckInternet(){String result = null;try {String ip = "www.baidu.com";Log.d(TAG, "Begin to check internet!");Runtime runtime = Runtime.getRuntime();java.lang.Process proc = runtime.exec("ping -c 3 -w 3 " + ip);//java.lang.Process proc = runtime.exec("ping -c 3 -w 3  www.google.com");InputStream input = proc.getInputStream();BufferedReader in = new BufferedReader(new InputStreamReader(input));StringBuffer stringBuffer = new StringBuffer();String content = "";while ((content = in.readLine()) != null) {stringBuffer.append(content+"\n");}Log.d(TAG, "result content : " + stringBuffer.toString());int status = proc.waitFor();Log.d(TAG, "Net Status:" + status);if(status == 0 || status == 2){result = "success";return true;}else {result = "failed";}} catch (IOException e) {result = "IOException";} catch (InterruptedException e) {result = "InterruptedException";} finally {Log.d(TAG, "result = " + result);}return false;}

2、那在哪里进行ping ip呢?多次折腾后发现在vendor\mediatek\proprietary\frameworks\opt\net\services\core\java\com\android\server\MtkConnectivityService.java  service里面添加比较合适,因为ping的过程会耗时,在其他地方ping会造成界面操作迟钝的情况。从下面的代码可以知道,如果是目前网络是不可以的状态下会通过ping ip再次确认。这么搞的如果在国外可以连接google的状态下就不会走这个路线。

3、看卡addCapability的代码frameworks\base\core\java\android\net\NetworkCapabilities.java

4、那最后看看settings里面如何读这个标识显示是否网络ok吧。         frameworks\opt\net\wifi\libs\WifiTrackerLib\src\com\android\wifitrackerlib\StandardWifiEntry.java

frameworks\opt\net\wifi\libs\WifiTrackerLib\src\com\android\wifitrackerlib\Utils.java

6、到这里功能是已经实现了,看看实际运行后的log吧。

7、贴一下整个测试的修改点。

frameworks/base/core/java/android/net/NetworkCapabilities.java和
  vendor/mediatek/proprietary/frameworks/opt/net/services/core/java/com/android/server/MtkConnectivityService.java

diff --git a/frameworks/base/core/java/android/net/NetworkCapabilities.java b/frameworks/base/core/java/android/net/NetworkCapabilities.java
old mode 100644
new mode 100755
index 6f61933..ecf72df
--- a/frameworks/base/core/java/android/net/NetworkCapabilities.java
+++ b/frameworks/base/core/java/android/net/NetworkCapabilities.java
@@ -45,6 +45,7 @@ import java.util.Arrays;import java.util.Objects;import java.util.Set;import java.util.StringJoiner;
+import android.util.Log;/*** Representation of the capabilities of an active network. Instances are
@@ -467,6 +468,12 @@ public final class NetworkCapabilities implements Parcelable {// then the capability will also be removed from the list of unwanted capabilities.// TODO: Consider adding unwanted capabilities to the public API and mention this// in the documentation.
+        Log.d("hulde", "capability "+capability);
+        if(capability == NET_CAPABILITY_VALIDATED)
+      {
+         Log.d("hulde", " capability is NET_CAPABILITY_VALIDATED ");
+         //return this;
+        }checkValidCapability(capability);mNetworkCapabilities |= 1 << capability;mUnwantedNetworkCapabilities &= ~(1 << capability);  // remove from unwanted capability list
@@ -516,6 +523,7 @@ public final class NetworkCapabilities implements Parcelable {*/public @NonNull NetworkCapabilities setCapability(@NetCapability int capability,boolean value) {
+        Log.d("hulde", "setCapability "+capability);if (value) {addCapability(capability);} else {
@@ -575,6 +583,7 @@ public final class NetworkCapabilities implements Parcelable {* @return {@code true} if set on this instance.*/public boolean hasCapability(@NetCapability int capability) {
+        Log.d("hulde", "mNetworkCapabilities= " + mNetworkCapabilities);return isValidCapability(capability)&& ((mNetworkCapabilities & (1 << capability)) != 0);}
diff --git a/vendor/mediatek/proprietary/frameworks/opt/net/services/core/java/com/android/server/MtkConnectivityService.java b/vendor/mediatek/proprietary/frameworks/opt/net/services/core/java/com/android/server/MtkConnectivityService.java
old mode 100644
new mode 100755
index 5eea14c..e492354
--- a/vendor/mediatek/proprietary/frameworks/opt/net/services/core/java/com/android/server/MtkConnectivityService.java
+++ b/vendor/mediatek/proprietary/frameworks/opt/net/services/core/java/com/android/server/MtkConnectivityService.java
@@ -258,6 +258,12 @@ import java.util.TreeSet;import java.util.concurrent.atomic.AtomicInteger;import android.provider.DeviceConfig;+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.BufferedReader;
+
+
+/*** @hide*/
@@ -2974,6 +2980,9 @@ public class MtkConnectivityService extends ConnectivityService {: "";log(nai.toShortString() + " validation " + (valid ? "passed" : "failed") + logMsg);}
+
+          Slog.e("hulde", "handleNetworkTested 1122 valid="+valid);
+          //valid = true;if (valid != nai.lastValidated) {if (wasDefault) {mDeps.getMetricsLogger()
@@ -3095,6 +3104,7 @@ public class MtkConnectivityService extends ConnectivityService {EVENT_NETWORK_TESTED,new NetworkTestedResults(mNetId, p.result, p.timestampMillis, p.redirectUrl));
+          Slog.e("hulde", "mTrackerHandler.sendMessage  1555552");mTrackerHandler.sendMessage(msg);// Invoke ConnectivityReport generation for this Network test event.
@@ -3115,6 +3125,7 @@ public class MtkConnectivityService extends ConnectivityService {@Overridepublic void notifyPrivateDnsConfigResolved(PrivateDnsConfigParcel config) {
+        Slog.e("hulde", "mTrackerHandler.sendMessage  155111");mTrackerHandler.sendMessage(mTrackerHandler.obtainMessage(EVENT_PRIVATE_DNS_CONFIG_RESOLVED,0, mNetId, PrivateDnsConfig.fromParcel(config)));
@@ -3129,6 +3140,7 @@ public class MtkConnectivityService extends ConnectivityService {@Overridepublic void notifyCaptivePortalDataChanged(CaptivePortalData data) {
+        Slog.e("hulde", "mTrackerHandler.sendMessage  12551200");mTrackerHandler.sendMessage(mTrackerHandler.obtainMessage(EVENT_CAPPORT_DATA_CHANGED,0, mNetId, data));
@@ -3151,6 +3163,7 @@ public class MtkConnectivityService extends ConnectivityService {} finally {Binder.restoreCallingIdentity(token);}
+          Slog.e("hulde", "mTrackerHandler.sendMessage  85981012");mTrackerHandler.sendMessage(mTrackerHandler.obtainMessage(EVENT_PROVISIONING_NOTIFICATION, PROVISIONING_NOTIFICATION_SHOW,mNetId, pendingIntent));
@@ -3158,6 +3171,7 @@ public class MtkConnectivityService extends ConnectivityService {@Overridepublic void hideProvisioningNotification() {
+        Slog.e("hulde", "mTrackerHandler.sendMessage  02052655251");mTrackerHandler.sendMessage(mTrackerHandler.obtainMessage(EVENT_PROVISIONING_NOTIFICATION, PROVISIONING_NOTIFICATION_HIDE, mNetId));}
@@ -4117,7 +4131,8 @@ public class MtkConnectivityService extends ConnectivityService {if (nai.partialConnectivity) {showNetworkNotification(nai, NotificationType.PARTIAL_CONNECTIVITY);} else {
-            showNetworkNotification(nai, NotificationType.NO_INTERNET);
+            //showNetworkNotification(nai, NotificationType.NO_INTERNET);
+              Slog.e("hulde", "showNetworkNotification NO_INTERNET");}}@@ -5996,6 +6011,7 @@ public class MtkConnectivityService extends ConnectivityService {this, mNetd, mDnsResolver, mNMS, providerId, Binder.getCallingUid());// Make sure the LinkProperties and NetworkCapabilities reflect what the agent info says.
+        Slog.e("hulde", "MtkConnectivityService registerNetworkAgent  56552225");nai.getAndSetNetworkCapabilities(mixInCapabilities(nai, nc));processLinkPropertiesFromAgent(nai, nai.linkProperties);@@ -6352,6 +6368,40 @@ public class MtkConnectivityService extends ConnectivityService {* maintained here that the NetworkAgent is not aware of (e.g., validated, captive portal,* and foreground status).*/
+
+  private boolean CheckInternet(){
+        String result = null;
+        try {
+                String ip = "www.baidu.com";
+                Log.d(TAG, "Begin to check internet!");
+                Runtime runtime = Runtime.getRuntime();
+                  java.lang.Process proc = runtime.exec("ping -c 3 -w 3 " + ip);
+                //java.lang.Process proc = runtime.exec("ping -c 3 -w 3  www.google.com");
+                InputStream input = proc.getInputStream();
+                BufferedReader in = new BufferedReader(new InputStreamReader(input));
+                StringBuffer stringBuffer = new StringBuffer();
+                String content = "";
+                while ((content = in.readLine()) != null) {
+                        stringBuffer.append(content+"\n");
+                }
+                Log.d(TAG, "result content : " + stringBuffer.toString());
+                int status = proc.waitFor();
+                Log.d(TAG, "Net Status:" + status);
+                if(status == 0 || status == 2){
+                     result = "success";
+                     return true;
+                }else {
+                     result = "failed";
+               }
+        } catch (IOException e) {
+                result = "IOException";
+        } catch (InterruptedException e) {
+                result = "InterruptedException";
+       } finally {
+                Log.d(TAG, "result = " + result);
+        }
+        return false;
+    }private NetworkCapabilities mixInCapabilities(NetworkAgentInfo nai, NetworkCapabilities nc) {// Once a NetworkAgent is connected, complain if some immutable capabilities are removed.// Don't complain for VPNs since they're not driven by requests and there is no risk of
@@ -6371,13 +6421,17 @@ public class MtkConnectivityService extends ConnectivityService {/// @}}}
+      Slog.e("hulde", "MtkConnectivityService mixInCapabilities 22525");// Don't modify caller's NetworkCapabilities.NetworkCapabilities newNc = new NetworkCapabilities(nc);if (nai.lastValidated) {newNc.addCapability(NET_CAPABILITY_VALIDATED);} else {
-            newNc.removeCapability(NET_CAPABILITY_VALIDATED);
+           if(CheckInternet())
+                 newNc.addCapability(NET_CAPABILITY_VALIDATED);
+           else
+              newNc.removeCapability(NET_CAPABILITY_VALIDATED);}if (nai.lastCaptivePortalDetected) {newNc.addCapability(NET_CAPABILITY_CAPTIVE_PORTAL);
@@ -6423,6 +6477,7 @@ public class MtkConnectivityService extends ConnectivityService {*/private void updateCapabilities(final int oldScore, @NonNull final NetworkAgentInfo nai,@NonNull final NetworkCapabilities nc) {
+        Slog.e("hulde", "MtkConnectivityService updateCapabilities  02152555212");NetworkCapabilities newNc = mixInCapabilities(nai, nc);if (Objects.equals(nai.networkCapabilities, newNc)) return;updateNetworkPermissions(nai, newNc);
@@ -7106,6 +7161,7 @@ public class MtkConnectivityService extends ConnectivityService {* @param nai The network that changed background states*/private void applyBackgroundChangeForRematch(@NonNull final NetworkAgentInfo nai) {
+    Slog.e("hulde", "MtkConnectivityService applyBackgroundChangeForRematch  1222255");final NetworkCapabilities newNc = mixInCapabilities(nai, nai.networkCapabilities);if (Objects.equals(nai.networkCapabilities, newNc)) return;updateNetworkPermissions(nai, newNc);

五、参考文章

Android Runtime.getRuntime().exec - 行走的思想 - 博客园

Android中的ping网络实现_我想要台时光机-CSDN博客

Android 9 网络配置_dk_work的博客-CSDN博客

Android wifi提示已连接但是无法访问网络_KisKis_8808的博客-CSDN博客

Android O 可以上网 提示无法访问网络_weixin_34291004的博客-CSDN博客

2021-11-29 AndroidR WiFi可以上网,但是Settings里提示“No Internet”的问题的一个解决方法,通过ping一个网站确认网络的情况。java ping 网络的代码。相关推荐

  1. 史上最详细微信小程序授权登录与后端SprIngBoot交互操作说明,附源代码,有疑惑大家可以直接留言,蟹蟹 2021.11.29完善更新小程序代码,

    2021.11.29 更新文章 你好,我是博主宁在春,一起学习吧!!! 写这篇文章的原因,主要是因为最近在写毕业设计,用到了小程序,这中间曲曲折折,一言难尽啊.毕业设计真的让人麻脑阔

  2. 用计算机发射wifi经常很卡,WiFi信号满格,网速却时快时慢,解决方法在这里……-电脑网速慢怎么办...

    我们日常生活中上网,最烦的就是网速慢了,有时候着急看一个网页或者视频,半天缓冲不出来的话,简直让人抓狂.而无线网作为很多人的上网方式,总让人有种时快时慢的感觉,那么WiFi信号究竟受哪些因素影响?如何 ...

  3. 英特尔酷睿11代CPU(TigerLake)在Nvme m.2 ssd下安装系统无法识别硬盘的解决方法

    背景 购入一台华硕灵耀14s,内置的是512G的英特尔660p,手动换成2T的英特尔760p,开机在BIOS界面识别到了硬盘,但是在PE下看不到硬盘 CPU Intel Core i7-1165G7 ...

  4. F1--DDR3的应用总结(二)-2021.11.29

    DDR3应用总结(二) 接DDR3应用总结(一) 4.使用MIG IP核构建DDR3应用 截图取自Xilinx官方手册ug586,figure1-51,MIG IP核是一个逻辑模块,相当于是由它连接了 ...

  5. 2021中石油程序设计平台新生热身赛7-挨打记录2021/11/29

    这期热身赛翘掉了,去看了院里的迎新晚会,得努力补啊...... 问题 A: 分组 时间限制: 1 Sec  内存限制: 128 MB 提交 状态 题目描述 一年一度的圣诞大联欢又要来临了.做为班长的小 ...

  6. Java学习日报—SQL基础—2021/11/29

    今天效率很低,就看了以下内容... 目录 1.1关键词DISTINCT 1.2 连表查询 1.2.1 内连接 1.2.2 外连接 1.3 查询执行顺序 1.1关键词DISTINCT DISTINCT  ...

  7. wf信号极佳但是显示连接不到服务器,wifi信号满格却上不了网怎么办【原因及解决方法】...

    不知道什么时候,wifi这个词进入了人们的眼球,现在的这个时代,wifi已经遍布各地,人们现在在外吃饭,有人会问,你们这有wifi吗?大家都愿意到有wifi的地方,因为连着wifi,不仅可以上网,而且 ...

  8. 设置计算机在睡眠状态下能共享,使用wifi共享精灵的过程中电脑会自动休眠锁屏的解决方法...

    我在使用wifi共享精灵的过程中经常是这样做:电脑一直开着,然后自己躺在床上用手机看小说.看韩剧.但几十分钟之后,电脑会因为长期没人操作而自动休眠,从而导致wifi连接不上,要是每次重启软件又太费事, ...

  9. Realtek PCIe GBE Family Controller(有线网卡)及Intel(R) Wi-Fi 6 AX201 160MHz(无线网卡)前出现出现黄色感叹号!解决方法。(win10)

    这个问题从我上午手贱更新了我电脑(拯救者Y7000p)的无线网卡驱动开始,折磨我一天了,现在我把过程和总结的方法记录下来希望对你们有用. 更新无线网卡驱动时过程没有任何问题.问题出在安装替换新旧版本后 ...

最新文章

  1. csgo怎么通过人机验证_让你的MacBook Pro完美运行CSGO!(图解版)
  2. RK3288 make otapackage 出错的问题【转】
  3. 从pfx里面 解析出公私钥
  4. 【效率】一次打包,无限复用!教你用 PyCharm 搭建一劳永逸的开发环境
  5. 设置中文环境_我花几年时间找到的学习中文好方法,值得你一看
  6. android 能调用gcc_如何在命令行下使用Android NDK交叉编译工具
  7. 2019年第一批重点作品版权保护预警名单公布 都是贺岁档
  8. python生成器函数的使用(模拟cycle函数)
  9. r语言 悲观剪枝_【R语言新书】前言Ⅲ—R语言编程思想
  10. [C/C++] 结构体存储问题
  11. mysql 3列索引_正确理解Mysql的列索引和多列索引
  12. redis类型 tp5_tp5配置使用redis笔记!
  13. 解析PayPal支付接口的PHP开发方式
  14. nodeJS中利用第三方内置模块实现数字转大写功能
  15. easyopenjtag使用教程(最新版)
  16. 在Windows中的“运行”对话框中调整历史记录
  17. 读书札记:德鲁克生命中的七堂课(转)
  18. 【每日一题】打卡 14
  19. Android Studio Build failed(出现 gradle sync failed 问题)解决方法
  20. 商学院·基础----02 不要为打翻的牛奶哭泣(沉没成本)

热门文章

  1. 企业微信管理员账号查看员工客户
  2. C语言科技感图片,AI制作科技感渐变图形(5)
  3. 安徽大学计算机学硕复试线,安徽大学2020年考研复试分数线
  4. 举例说明层次分析的三大原则_公差原则
  5. Chakra调试笔记 TypedArray
  6. 什么是JRE,JRE是什么意思?
  7. 【阿里云】WindowsServer2012 搭建FTP站点 图文记录
  8. endnote文献管理
  9. 出现Library not loaded错误解决方案
  10. 利用Python爬取百度指数中需求图谱的关键词