一、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博客