android - 无法在 android 设备的省电模式下以编程方式检查网络信息
问题描述
我想检查我的 android 应用程序中的连接状态。我调用下一个方法onResume
:
public boolean isThereInternetConnection() {
boolean isConnected = false;
ConnectivityManager connectivityManager =
(ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
NetworkInfo networkInfo = (connectivityManager != null) ? connectivityManager.getActiveNetworkInfo() : null;
if (networkInfo != null) {
isConnected = networkInfo.isConnected();
}
return isConnected;
}
在正常模式下它工作得很好。但是当我的设备处于节电模式并且我从后台打开我的活动时,方法isThereInternetConnection()
有时会返回 false(互联网连接良好)。为此我检查networkInfo.getDetailedState()
并在省电模式下DetailedState.BLOCKED
即使我有良好的互联网连接它也会返回。那么如何解决这个错误,如何在省电模式下检查互联网连接并获得真实值真或假 - 是否连接到互联网?
解决方案
检查互联网的最佳方法实际上是 ping 到互联网。有时互联网已连接但无法访问网络。
public boolean isOnline() {
try {
int timeoutMs = 1500;
Socket sock = new Socket();
SocketAddress sockaddr = new InetSocketAddress("8.8.8.8", 53);
sock.connect(sockaddr, timeoutMs);
sock.close();
return true;
} catch (IOException e) { return false; }
}
上述代码不会在主线程上运行,需要互联网连接权限。
下面的代码有点慢,但可以在主线程上运行。需要互联网连接权限:
public boolean isOnline() {
Runtime runtime = Runtime.getRuntime();
try {
Process ipProcess = runtime.exec("/system/bin/ping -c 1 8.8.8.8");
int exitValue = ipProcess.waitFor();
return (exitValue == 0);
}
catch (IOException e) { e.printStackTrace(); }
catch (InterruptedException e) { e.printStackTrace(); }
return false;
}
推荐阅读
- reactjs - 如何创建对象的唯一实例
- r - 如何在for循环中为箱线图自动调整ylim
- javascript - npm 包中断删除过时的文件
- c# - 在两个单词之间找到一个单词并替换它们
- google-nearby - 在 Android Go R 中附近连接成功后 Wifi 自动关闭
- numpy - 为什么当我创建一个随机数组时会出现负值 - “np.random.rand”
- django - 在图形右侧绘制短划线图形输入
- c# - 如何控制在主菜单中所做的音频更改也应用于游戏场景音频设置?
- java - Eclipse - 调试器不会在 xTend 代码断点处停止,但可以在 java 代码断点处停止
- php - Laravel 错误:找不到用于多重身份验证的类 'App\Http\Controllers\Auth\Auth'