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

一、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 {
 
         @Override
         public 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 {
 
         @Override
         public 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 {
 
         @Override
         public 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博客

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值