Android中的网络链接问题NetworkInfo

百度搜索 如何判断android网络是否可用,会有一大堆的结果。

但是最终结底还是用networkInfo.isAvailable来判断的,但是经过我的实验,我发现此方法只是判断手机联网状态是否就绪,而不是真的判断忘络是否已经链接。

下面贴出我的测试经过。

测试机型:华为荣耀3C ROM miui v6(其他机型是否如此有待验证,且真机和虚拟的结果肯定是有出入,所以这方面最好用真机来测试)

测试代码:

//AndroidManifest.xml中需加入权限<uses-permission android:name="android.permission.ACCESS_NETWORK_STATE" />
ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo[] networkInfos = cm.getAllNetworkInfo();
        for (NetworkInfo info : networkInfos) {
            Log.i("AAA", info.getTypeName() + " is connected " + info.isConnected() + " isAvailable " + info.isAvailable());
        }
        NetworkInfo info = cm.getActiveNetworkInfo();
        if (info != null)
            Log.i("AAA", "network type is " + info.getTypeName()
                    + " network is available " + info.isAvailable()
                    + " network is connected " + info.isConnected());

测试经过:

第一步:WIFI打开并连接网络,数据开关打开。打印结果:

 mobile is connected false isAvailable true
 WIFI is connected true isAvailable true
 mobile_mms is connected false isAvailable true
 mobile_supl is connected false isAvailable true
 mobile_dun is connected false isAvailable true
 mobile_hipri is connected false isAvailable true
 BLUETOOTH_TETHER is connected false isAvailable false
 ETHERNET is connected false isAvailable false
 mobile_fota is connected false isAvailable true
 mobile_ims is connected false isAvailable true
 mobile_cbs is connected false isAvailable true
 active network type is WIFI network is available true network is connected true

第二步 :WIFI打开,但是没有连接网络,数据开关打开连接数据流量。打印结果:

 mobile is connected true isAvailable true
 WIFI is connected false isAvailable true
 mobile_mms is connected false isAvailable true
 mobile_supl is connected false isAvailable true
 mobile_dun is connected false isAvailable true
 mobile_hipri is connected false isAvailable true
 BLUETOOTH_TETHER is connected false isAvailable false
 ETHERNET is connected false isAvailable false
 mobile_fota is connected false isAvailable true
 mobile_ims is connected false isAvailable true
 mobile_cbs is connected false isAvailable true
 active network type is mobile network is available true network is connected true

经过上面对比可知:当wifi打开时,数据连接其实是没有连接的。wifi开关只要是打开的,不管有没有连接wifi ,wifi都是Available的。

第三步:关闭wifi开关,数据开关开始并已经连接数据流量。 打印结果:

 mobile is connected true isAvailable true
 WIFI is connected false isAvailable false
 mobile_mms is connected false isAvailable true
 mobile_supl is connected false isAvailable true
 mobile_dun is connected false isAvailable true
 mobile_hipri is connected false isAvailable true
 BLUETOOTH_TETHER is connected false isAvailable false
 ETHERNET is connected false isAvailable false
 mobile_fota is connected false isAvailable true
 mobile_ims is connected false isAvailable true
 mobile_cbs is connected false isAvailable true
 active network type is mobile network is available true network is connected true

结论1:只有当wifi关闭的时候 wifi的available状态才是false的

第四步:关闭wifi开关和数据开关。打印结果:

 mobile is connected false isAvailable true
 WIFI is connected false isAvailable false
 mobile_mms is connected false isAvailable true
 mobile_supl is connected false isAvailable true
 mobile_dun is connected false isAvailable true
 mobile_hipri is connected false isAvailable true
 BLUETOOTH_TETHER is connected false isAvailable false
 ETHERNET is connected false isAvailable false
 mobile_fota is connected false isAvailable true
 mobile_ims is connected false isAvailable true
 mobile_cbs is connected false isAvailable true

发现,当wifi开关关闭的时候 wifi的available状态是 false的,但是当关闭数据连接的开关的时候,mobile的连接状态 isConnected虽然是false但是Available仍然是true的。

而且最后一行Log没有打出来说明此时getActiveNetworkInfo()的返回值是null

上面的四个步骤都是在手机SIM卡有信号的情况下测试的。也就是说只要打开数据开关数据连接就能连上的情况下测试的。正常情况下应该还要测试当手机卡没有信号的情况下的结果,但是这种情况不太好模拟,所以我就到

sim卡管理中心把sim给禁用掉了。具体没有研究过,所以不太清楚这种情况能不能模拟手机没有信号的情况这个待定。

打印的结果如下:

 mobile is connected false isAvailable false
 WIFI is connected false isAvailable false
 mobile_mms is connected false isAvailable false
 mobile_supl is connected false isAvailable false
 mobile_dun is connected false isAvailable false
 mobile_hipri is connected false isAvailable false
 BLUETOOTH_TETHER is connected false isAvailable false
 ETHERNET is connected false isAvailable false
 mobile_fota is connected false isAvailable false
 mobile_ims is connected false isAvailable false
 mobile_cbs is connected false isAvailable false

不出意外,此时的mobile的available状态已经成为了false。

其实通过NetworkInfo的api中就可以看出来

isAvailable的解释是:Indicates whether network connectivity is possible.   表明网络连接是否posible,posible可能的意思,而并不是已经连接

isConnected():Indicates whether network connectivity exists and it is possible to establish connections and pass data.表明网络连接是否存在并且可以传递数据。

这两处的连接用的是 connectivity名词。在此处可以理解为  “建立链接”这一事实。(本人英语渣渣般的存在,如果不对,请无视)。

当然百度搜索网络连接是否可用,给的结果用isAvailable判断是否可用也无可厚非,因为这个确实是判断网络是否可用的,谷歌给出的解释也是这个意思,只是这个地方的可用只是一种可能性的判断,是判断网络状态是否已经准备好可以用来建立连接了。

所以,判断网络是否已经建立链接,并且可以上网了的判断应该是酱紫的:

public boolean isNetWorkConnected() {
        boolean isConnected = false;
        ConnectivityManager cm = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE);
        NetworkInfo activeInfo = cm.getActiveNetworkInfo();
        if (activeInfo != null && activeInfo.isAvailable() && activeInfo.isConnected()) {
            isConnected = true;
        }
        return isConnected;
    }

应该就是这样。

至于像腾讯的那种wifi链接上,但是连接像CMCC这种没有登录账号就不能用的wifi后提示网络不可用的方法。暂时没有从api中找到思路,不过看到有网友说可以请求一下一个接口,如果TimeOut的话就是wifi不可用,私以为此方法可行,如果你感觉你们的服务器稳定性不是很好,可以背靠大公司呀,向BAT这样的网站发起一个http请求,如果响应超时,我想一般情况下就是你手机网络设置的问题了。(当然我大企鹅的肯定没有这么简单,他们是有socket连接的,心里默念企鹅大法好,BAT技术的牛逼性大家有目共睹。)

以上。

如果有不对的地方还请指正!

时间: 2024-10-13 02:41:30

Android中的网络链接问题NetworkInfo的相关文章

Android中判断网络连接是否可用及监控网络状态

Android中判断网络连接是否可用及监控网络状态 作者: 字体:[增加 减小] 类型:转载 获取网络信息需要在AndroidManifest.xml文件中加入相应的权限,接下来详细介绍Android中判断网络连接是否可用及监控网络状态,感兴趣的朋友可以参考下 获取网络信息需要在AndroidManifest.xml文件中加入相应的权限. <uses-permission android:name="android.permission.ACCESS_NETWORK_STATE"

如何在Android中播放网络传输过来的AAC音频?

============问题描述============ 如何在Android中播放网络传输过来的AAC音频?每个包都有ADTS头的. ============解决方案1============ 如果是应用的话,直接设置MediaPlayer setDataSource设置为网络音频的uri,然后prepareAsync(), prepare完成后调用start不就可以了吗? framework层的话还是要用aacdecoder进行解码播放,要么用软件解码,要么用硬件解码.

Android之旅十五 android中的网络操作

android中的网络操作和java里面没有什么区别,java里面的很多网络操作方法都可以搬到android中去使用,主要几个点: 1.post和get请求的区别,大家可以在网上查阅有关资料进行了解,get主要以向地址中拼接字符串参数发送到服务器,长度有限制,并且请求参数暴露在地址栏中,不怎么安全:post则主要是将请求参数转换为相应的http协议请求体发送到服务器,相比get方式,参数的长度没有限制,并且参数信息不会暴露给用户: 2.我们在java web里面通过浏览器以post方式发送数据,

android中的网络解析xml,json,html框架

android中网络请求回来数据之后,我们要对其解析.请求的返回的结果格式如果不是自定义协议:那么返回的数据通常是xml,json,html形式的数据了. 下面就是针对上面3种格式进行解析. xml解析使用工具:在android中推荐使用pull解析,还有其他的dom,sax解析. json解析使用工具:推荐使用Fastjson,由阿里提供.还有其他的如JackSon,Gson解析. html解析使用工具:推荐使用Jsoup,还有其他的如HtmlParser;关于使用这个,网络上的爬虫就是这样子

Android中的网络技术基础用法

有的时候用多了Android的一些开源框架用多了,就会把最基础的一些东西给忘了,今天来重温一下Android的网络基础.包括这个Http协议的网络请求,JSON解析. 使用HTTP协议访问网络 在 Android上发送 HTTP 请求的方式一般有两种,HttpURLConnection 和 HttpClient,先来看一下 HttpURLConnection 的用法.首先需要获取到 HttpURLConnection 的实例,一般只需 new出一个 URL 对象,并传入目标的网络地址,然后调用一

Android中解析网络请求的URL

最近正在做Android网络应用的开发,使用了android网络请求方面的知识,现在向大家介绍网络请求方面的知识,我们知道android中向服务器端发送一个请求,(这就是我们通常所说的POST请求),我们要发送一个完整的URL,然后服务器端接收到这个URL,对这个URL进行特定的解析,就是对URL进行解析,转化为JSON数据,然后,我们只要处理这个JSON数据就可以了. 我现在就用我的项目实例来体现解析URL的过程: 1.组装URL的过程: private String getOrderPayU

Android中的网络编程

谷歌在Android6.0之后就废弃了使用HttpClinet进行网络连接.所以,这里需要重点学习的是通过HttpUrlConnect进行网络连接. String path="这里是你想要的连接"; URL url=new URL(path); HttpURLConnection huc=(HttpURLConnection)url.openConnection(); huc.setConnectTimeout(3000); huc.setReadTimeout(3000); //请求

Android中访问网络时url中带有特殊字符的问题

Component Example value Also known as Protocol http scheme Authority username:[email protected]:8080   User Info username:password   Host host   Port 8080   File /directory/file?query   Path /directory/file   Query query   Ref ref fragment 一个完整的url链接

Android中获取网络数据时的分页加载

//此实在Fragment中实现的,黄色部分为自动加载,红色部分是需要注意的和手动加载,    蓝色部分是睡眠时间,自我感觉不用写  ,还有就是手动加载时,不知道为什么进去后显示的就是最后一行,求大神指教 public class Fragment1 extends Fragment{               //加载的第几页        private int index = 0;            private List<News> news=new ArrayList<