全球最实用的IT互联网信息网站!

AI人工智能P2P分享&下载搜索网页发布信息网站地图

当前位置:诺佳网 > AI人工智能 > AI通用技术 >

Android检测是否连接互联网

时间:2017-11-27 13:01

人气:

作者:admin

标签: 互联网  APP  Android 

导读:Android检测是否连接互联网-如今开发的app没有不用到网络的,所以对当前网络状态的准确把控就尤为重要了。经常有这样的场景:获取手机当前网络类型、是否连接Wi-Fi、是否能够访问外...

如今开发的app没有不用到网络的,所以对当前网络状态的准确把控就尤为重要了。经常有这样的场景:获取手机当前网络类型、是否连接Wi-Fi、是否能够访问外网(英特网)。今天我们要说的就是如何判断手机是否能够与服务器通信

Note: 本文所有代码均是基于kotlin语言实现

1.错误方法

在写代码前,先在网上搜索了主流的解决方案,发现大家都是前篇一律的思路:使用NetworkInfo中的一个状态(State)是否是连接状态来判断,但是结果是残酷的,该方法是用来判断是否连接了Wi-Fi,并不能表示手机连接了互联网。不过我也把代码贴出来,供大家参考:

2.正确方法

权限:

方案一:ping服务器地址(简单)

通过ping命令的返回结果来得知是否连接外网,现在主流有效的方法均是这个原理,只是大部分都是ping的百度的地址,这里推荐使用8.8.8.8,示例代码如下:

PS:8.8.8.8是一个dns服务器地址,是Google提供的免费DNS服务器的IP地址。
这个方案的优点是:

可以运行在主线程,且是同步的

速度快

缺点也有:

在一些老的手机上并不起效,比如Galaxy S3,原因是跟手机的OEM有关,具体原因可以参考:Why does ping works on some devices and not others?

方案二:连接服务器端口(推荐)

使用socket连接服务器的一个端口,并通过连接的结果来判断手机是否连接外网,推荐使用该方法,因为该方法适用于所有的手机Android版本,示例代码如下:

funisOnline() =try{valtimeoutMs =1500Socket().use{//连接的端口不同,网络协议不同。 DNS:53;HTTP:80valsocketAddr = InetSocketAddress("8.8.8.8",53) it.connect(socketAddr, timeoutMs) }true} catch (e: Throwable) {false}

优点

速度快,非常快

方法通吃,没有烦人的版本适配

缺点

不能在主线程中运行

方案三:根据域名获取IP(推荐)

使用InetAddress提供的方法getByName()获取某个域名的IP地址,然后根据是否获取的成功来判断是否连接外网。推荐使用该方法。

优点

速度快,超时可自定义

可运行在主线程

各个版本通吃

缺点:

暂无

3.总结

其实以上有效的三个方案的思路都是一样的:

进行一次网络访问(必须访问公网的一个地址,无论是域名或者IP地址)

根据网络返回的结果进行实际判断

温馨提示:以上内容整理于网络,仅供参考,如果对您有帮助,留下您的阅读感言吧!
相关阅读
本类排行
相关标签
本类推荐

CPU | 内存 | 硬盘 | 显卡 | 显示器 | 主板 | 电源 | 键鼠 | 网站地图

Copyright © 2025-2035 诺佳网 版权所有 备案号:赣ICP备2025066733号
本站资料均来源互联网收集整理,作品版权归作者所有,如果侵犯了您的版权,请跟我们联系。

关注微信