Android 网络状态判断

这篇具有很好参考价值的文章主要介绍了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系统这个值一直是false
                            return 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) {
            //注册 NetworkCallBack
            if (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";

        @Override
        public void onCapabilitiesChanged(@NonNull Network network, @NonNull NetworkCapabilities networkCapabilities) {
            super.onCapabilitiesChanged(network, networkCapabilities);
            if (NetworkUtils.netWorkState(getBaseContext())) {
                Log.i(TAG, "onCapabilitiesChanged ---> ====网络可正常上网===网络类型为: " + NetworkUtils.networkType(MainActivity.this));
            }
           
        }

        @Override
        public void onAvailable(@NonNull Network network) {
            super.onAvailable(network);
            Log.i(TAG, "==网络连接成功,通知可以使用的时候调用====onAvailable===");
        }

        @Override
        public void onUnavailable() {
            super.onUnavailable();
            Log.i(TAG, "==当网络连接超时或网络请求达不到可用要求时调用====onUnavailable===");

        }

        @Override
        public void onBlockedStatusChanged(@NonNull Network network, boolean blocked) {
            super.onBlockedStatusChanged(network, blocked);
            Log.i(TAG, "==当访问指定的网络被阻止或解除阻塞时调用===onBlockedStatusChanged==");

        }

        @Override
        public void onLosing(@NonNull Network network, int maxMsToLive) {
            super.onLosing(network, maxMsToLive);
            Log.i(TAG, "==当网络正在断开连接时调用===onLosing===");

        }

        @Override
        public void onLost(@NonNull Network network) {
            super.onLost(network);
            Log.i(TAG, "==当网络已断开连接时调用===onLost===");

        }


        @Override
        public void onLinkPropertiesChanged(@NonNull Network network, @NonNull LinkProperties linkProperties) {
            super.onLinkPropertiesChanged(network, linkProperties);
            Log.i(TAG, "==当网络连接的属性被修改时调用===onLinkPropertiesChanged===");

        }

    };

2.3异步通过ping方式判断网络状态文章来源地址https://www.toymoban.com/news/detail-839486.html

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;

到了这里,关于Android 网络状态判断的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • Android 监听网络状态变化

    此篇存在的主要意义在于解决用户使用app中网络状态发生了变化,需要我们去动态监听网络连接状态(有网、无网)、网络类型 (包括wifi、移动网络 - 3G、4G等等) 门前授课 关于网络状态的监听,主要是基于 Android 广播 - BroadcaseReceiver组件 ~ 同时关于广播的注册方面,从An

    2024年02月10日
    浏览(50)
  • Android 获取网络连接状态新方法

            Android12上,有的app模块判断当前网络的类型和连接状态时,还是使用的旧的API,导致返回的结果不准确,影响代码逻辑判断,本篇文章就这一问题,整理一下判断网络类型和连接状态的新方法。         在Android 10以前的版本,大家都是通过NetworkInfo.java 的get

    2024年02月08日
    浏览(35)
  • Android网络状态变化监听 -- 结合registerNetworkCallback和广播(kotlin)

        说明   AndroidAndroid针对网络状态变化的监听,在应用内我们通用需要监听设备网络状态的变化,作出相应的业务处理,需要一个方便的、全局的监听实现。。   针对不同设备的系统版本,使用不同的API方法实现;   注意使用广播监听网络状态在高版本的适配问题

    2024年02月03日
    浏览(47)
  • [1159]adb判断手机屏幕状态并点亮屏幕

    唤醒屏幕操作 解锁屏幕 关闭和开启屏幕样例 重新启动手机app 以上操作需要adb环境已经搭建好,使用以下命令查看连接设备 想获取某个APP名称用于启动时,手机先打开APP,然后执行以下命令 参考:https://www.cnblogs.com/Kirito-Asuna-Yoyi/p/Python-ADB1.html https://blog.csdn.net/weixin_40895135/

    2024年02月11日
    浏览(87)
  • 【FPGA】串口通信讲解-状态机判断数据值

    🎉欢迎来到FPGA专栏~串口通信讲解 ☆* o(≧▽≦)o *☆ 嗨 ~我是 小夏与酒 🍹 ✨ 博客主页: 小夏与酒的博客 🎈该系列 文章专栏: FPGA学习之旅 文章作者技术和水平有限,如果文中出现错误,希望大家能指正🙏 📜 欢迎大家关注! ❤️ 🥝 视频演示: FPGA串口通信控制led点亮

    2024年02月13日
    浏览(35)
  • Unity动画状态的获取和常用判断(逐步完善)

    AnimatorStateInfo minfo = m_animator.GetCurrentAnimatorStateInfo(0); 其中参数0代表Base Layer GetCurrentAnimatorStateInfo(0)即是获取当前动画控制器当前正在播放的动画状态 stateInfo.fullPathHash==Animator.StringToHash(\\\"Base Layer.attack\\\") stateInfo.fullPathHash即是当前动画控制器当前正在播放动画的Hash值 Animator.Stri

    2024年02月11日
    浏览(65)
  • Element UI 实战:跨页保存表格选中状态与判断状态可选性的高效方案

            在前文中,我们曾深入探讨了在修改数据后跨页时提醒用户可能丢失数据的问题。虽然这种方式对于一些场景是足够的,但当涉及选择框时,我们需要更为智能和高效的解决方案。在本文中,我们将分享一种基于 Element UI 的实际案例,旨在实现跨页保存选中项与禁

    2024年02月04日
    浏览(39)
  • 使用ICMP协议来判断UDP端口的存活状态

            我们使用了原始套接字(socket.SOCK_RAW)来发送和接收ICMP消息,也就是通过模拟ICMP协议来进行UDP端口的探测。我们构造了一个简单的ICMP数据包,并将其发送到目标主机的特定端口。然后,我们等待接收目标主机返回的ICMP消息,并判断其类型和代码是否为端口不可

    2024年02月10日
    浏览(38)
  • keycloak~对接login-status-iframe页面判断用户状态变更

    上次我们说了,keycloak的login-status-iframe页面的作用,并解决了跨域情况下,iframe与主页面数据传递的方法,这一次,我们主要分析login-status-iframe.html这个文件的源码,然后分析在我们系统中如何与这个页面对接。 这个页面主要由以下4个方法组成,下面分别去介绍 checkState(c

    2024年02月04日
    浏览(46)
  • Unity3D实现UI的单击、双击、拖动状态判断

    这篇文章就来实现UI的单击、双击、按压、拖动的不同状态判断。不定时更新Unity开发技巧,觉得有用记得一键三连哦。 示例、 判断单击和双击,主要是判断点击的次数。 UI的点击事件,需要继承UI的点击事件接口,重写点击事件即可。 UI点击事件接口: 3-1-1 所引用的命名空

    2024年01月20日
    浏览(63)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包