当前位置: 首页 > news >正文

Android 网络状态判断

1、获取网络信息,首先需要获取权限

<uses-permission android:name="android.permission.INTERNET" />
<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />

2.1我们通过ConnectivityManager可以获取状态,但是我们需要考虑到Android版本不同获取方式不同。

2.1.1hasCapability可以判断网络是否连接,常用参数如下:

 NetworkCapabilities.NET_CAPABILITY_INTERNET:判断是否连上网

NetworkCapabilities.NET_CAPABILITY_VALIDATED:判断当前是否能上网,但是发现小米11Android12添加证书后,一直是false
 

 private static boolean netWorkState(Context context) {if (context != null) {try {ConnectivityManager connectivityManager = (ConnectivityManager) context.getSystemService(Context.CONNECTIVITY_SERVICE);// 通过版本去判断if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) {Network network = connectivityManager.getActiveNetwork();//network 为空,则表示没有网络if (network != null) {NetworkCapabilities capabilities = connectivityManager.getNetworkCapabilities(network);// NetworkCapabilities   为空,则表示没有网络if (capabilities != null) {//capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_VALIDATED) 小米11,android 12系统这个值一直是falsereturn capabilities.hasCapability(NetworkCapabilities.NET_CAPABILITY_INTERNET);}}} else {NetworkInfo info = connectivityManager.getActiveNetworkInfo();if (info != null) {return info.isAvailable();}}return false;} catch (Exception e) {e.printStackTrace();}}return true;}

2.1.2hasCapability可以判断网络类型,常用参数如下:

NetworkCapabilities.TRANSPORT_WIFI:表示接入的是WIFI网络
NetworkCapabilities.TRANSPORT_CELLULAR:表示接入的是数据网络

 public static void networkType(NetworkCapabilities networkCapabilities) {if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_CELLULAR)) {//当前在使用Mobile流量上网} else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI)) {//当前在使用WiFi上网} else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_BLUETOOTH)) {//当前使用蓝牙上网} else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_ETHERNET)) {//当前使用以太网上网} else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_VPN)) {当前使用VPN上网} else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_WIFI_AWARE)) {//表示此网络使用Wi-Fi感知传输} else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_LOWPAN)) {//表示此网络使用LoWPAN传输} else if (networkCapabilities.hasTransport(NetworkCapabilities.TRANSPORT_USB)) {//表示此网络使用USB传输} else {//未知}}

2.2异步通过registerDefaultNetworkCallback获取网络状态(华为手机,在使用过程,网络状态不准确)

 ConnectivityManager  connectivityManager = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);if (connectivityManager != null) {//注册 NetworkCallBackif (Build.VERSION.SDK_INT >= Build.VERSION_CODES.N) {connectivityManager.registerDefaultNetworkCallback(networkCallBack);}}

2.2.1networkCallBack

 private ConnectivityManager.NetworkCallback networkCallBack = new ConnectivityManager.NetworkCallback() {private static final String TAG = "TAG";@Overridepublic void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) {super.onCapabilitiesChanged(network, networkCapabilities);if (NetworkUtils.netWorkState(getBaseContext())) {Log.i(TAG, "onCapabilitiesChanged ---> ====网络可正常上网===网络类型为: " + NetworkUtils.networkType(MainActivity.this));}}@Overridepublic void onAvailable(@NonNull Network network) {super.onAvailable(network);Log.i(TAG, "==网络连接成功,通知可以使用的时候调用====onAvailable===");}@Overridepublic void onUnavailable() {super.onUnavailable();Log.i(TAG, "==当网络连接超时或网络请求达不到可用要求时调用====onUnavailable===");}@Overridepublic void onBlockedStatusChanged(@NonNull Network network, boolean blocked) {super.onBlockedStatusChanged(network, blocked);Log.i(TAG, "==当访问指定的网络被阻止或解除阻塞时调用===onBlockedStatusChanged==");}@Overridepublic void onLosing(@NonNull Network network, int maxMsToLive) {super.onLosing(network, maxMsToLive);Log.i(TAG, "==当网络正在断开连接时调用===onLosing===");}@Overridepublic void onLost(@NonNull Network network) {super.onLost(network);Log.i(TAG, "==当网络已断开连接时调用===onLost===");}@Overridepublic void onLinkPropertiesChanged(@NonNull Network network, @NonNull LinkProperties linkProperties) {super.onLinkPropertiesChanged(network, linkProperties);Log.i(TAG, "==当网络连接的属性被修改时调用===onLinkPropertiesChanged===");}};

2.3异步通过ping方式判断网络状态

try {Runtime runtime = Runtime.getRuntime();Process p = runtime.exec("ping -c 1 8.8.8.8");int waitFor = p.waitFor();return waitFor == 0;} catch (IOException | InterruptedException e) {e.printStackTrace();}
return false;

http://www.lryc.cn/news/265396.html

相关文章:

  • 管理类联考——数学——真题篇——按知识分类——代数——数列
  • .net core webapi 自定义异常过滤器
  • SuperMap iServer发布的ArcGIS REST 地图服务如何通过ArcGIS API加载
  • python调用GPT API
  • ModuleNotFoundError: No module named ‘tensorflow‘
  • 智能优化算法应用:基于鹰栖息算法3D无线传感器网络(WSN)覆盖优化 - 附代码
  • 自定义Taro上传图片hooks(useUploadImg)
  • 量子密码学简介
  • 使用docker创建自己的Android编译容器
  • 4-Docker命令之docker load
  • 微信小程序格创校园跑腿小程序源码v1.1.64+前端
  • 【单元测试】测还是不测,这是一个问题
  • Global Mapper SDK 19 中文开发文档(八)
  • es检索之复合检索
  • 09.list 容器
  • 速盾网络:网站用速盾cdn的好处
  • Centos7在安装Graylog时新安装MongoDB报错端口不监听服务不启动无法运行启动失败
  • Spark Machine Learning进行数据挖掘的简单应用(兴趣预测问题)
  • DRF从入门到精通二(Request源码分析、DRF之序列化、反序列化、反序列化校验、序列化器常用字段及参数、source、定制字段、保存数据)
  • Flink系列之:Upsert Kafka SQL 连接器
  • 前端与后端的异步编排(promise、async、await 、CompletableFuture)
  • python打开opencv图像与QImage图像及其转化
  • linux 其他版本RCU
  • 【单调栈】LeetCode:2818操作使得分最大
  • uniapp 添加分包页面,配置分包预下载
  • 成功案例分享:物业管理小程序如何助力打造智慧社区
  • Electron执行本地cmd命令
  • YOLOv8改进 | 主干篇 | 利用MobileNetV3替换Backbone(轻量化网络结构)
  • MATLAB Mobile - 使用预训练网络对手机拍摄的图像进行分类
  • LangChain入门指南:定义、功能和工作原理