Android如何判断网络类型

Stella981
• 阅读 822

开发中有时需要对设备的网络类型进行展示,用的wifi还是3g网络,开发板是连接的以太网etc。

网上关于Android检测网络类型的代码很多,这里为了方便理解,对项目中用到的代码整理一遍,

Android中判断网络类型需要用到ConnectivityManager类,首先我们先检查设备是否连接到网路。

// 检查是否连接到网络,连接上的网有没有信号,这里我们并不清楚todo // whether connect to internet public static boolean networkConnected() { if (context != null) { ConnectivityManager manager = (ConnectivityManager) App.getContext(). getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo info = manager.getActiveNetworkInfo(); return info != null && info.isAvailable(); } return false; }

获取网络类型需要我们对NetworkInfo进行分析,NetworkInfo提供了getTypeName()和getType()方法来判断连接的是wifi还是mobile网络。

比如想要知道设备是否连接上以太网(一般是Android开发板上面会用到)

// 检查以太网络是否连接 // if mobile data connect public static boolean ethrnetConnected() { ConnectivityManager manager = (ConnectivityManager) App.getContext().             getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo info = manager.getActiveNetworkInfo(); if (info != null) { if (info.getType() == TYPE_ETHERNET) return true; } return false; }

这边TYPE_ETHERNET是以太网的类型码,比较常用的还有TYPE_WIFI、TYPE_MOBILE等,大家可以自行百度,谷歌。wifi、手机网络是否连接和上面的写法差不多,就不一一叙述了。(注意App.getContext()这里的Context不能为空)。

下面通过一个方法来实现判断是wifi、移动网络还是以太网,移动网络还需进一步分析是2、3、4g。

先定义一些整形变量代表不同的网络。

/*** 没有网络*/ public static final int NETWORK_TYPE_INVALID = 0; /*** WIFI网络*/ public static final int NETWORK_TYPE_WIFI = 1; /*** 2G网络*/ public static final int NETWORK_TYPE_2G = 2; /*** 3G网络*/ public static final int NETWORK_TYPE_3G = 3; /*** Wap网络*/ public static final int NETWORK_TYPE_WAP = 4; /*** 以太网络*/ public static final int NETWORK_TYPE_ETHERNET = 5;

public static int getNetWorkType() { int mNetWorkType = 0; ConnectivityManager manager = (ConnectivityManager) App.getContext() .getSystemService(Context.CONNECTIVITY_SERVICE); NetworkInfo networkInfo = manager.getActiveNetworkInfo(); if (networkInfo != null && networkInfo.isConnected()) { String type = networkInfo.getTypeName(); if (type.equalsIgnoreCase("WIFI")) { mNetWorkType = NETWORK_TYPE_WIFI; } else if (type.equalsIgnoreCase("MOBILE")) { String proxyHost = android.net.Proxy.getDefaultHost(); mNetWorkType = TextUtils.isEmpty(proxyHost) ? (isFastMobileNetwork() ? NETWORK_TYPE_3G : NETWORK_TYPE_2G) : NETWORK_TYPE_WAP; } else if (type.equalsIgnoreCase("ETHERNET")) { mNetWorkType = NETWORK_TYPE_ETHERNET; } } else { mNetWorkType = NETWORK_TYPE_INVALID; } return mNetWorkType; }

其中为了区别是3g还是2g我们定义了isFastMobileNetwork()方法,主要用到了TelephonyManager类:

private static boolean isFastMobileNetwork() { TelephonyManager telephonyManager = (TelephonyManager) App.getContext().             getSystemService(Context.TELEPHONY_SERVICE); switch (telephonyManager.getNetworkType()) { case TelephonyManager.NETWORK_TYPE_1xRTT: return false; // ~ 50-100 kbps case TelephonyManager.NETWORK_TYPE_CDMA: return false; // ~ 14-64 kbps case TelephonyManager.NETWORK_TYPE_EDGE: return false; // ~ 50-100 kbps case TelephonyManager.NETWORK_TYPE_EVDO_0: return true; // ~ 400-1000 kbps case TelephonyManager.NETWORK_TYPE_EVDO_A: return true; // ~ 600-1400 kbps case TelephonyManager.NETWORK_TYPE_GPRS: return false; // ~ 100 kbps case TelephonyManager.NETWORK_TYPE_HSDPA: return true; // ~ 2-14 Mbps case TelephonyManager.NETWORK_TYPE_HSPA: return true; // ~ 700-1700 kbps case TelephonyManager.NETWORK_TYPE_HSUPA: return true; // ~ 1-23 Mbps case TelephonyManager.NETWORK_TYPE_UMTS: return true; // ~ 400-7000 kbps case TelephonyManager.NETWORK_TYPE_EHRPD: return true; // ~ 1-2 Mbps case TelephonyManager.NETWORK_TYPE_EVDO_B: return true; // ~ 5 Mbps case TelephonyManager.NETWORK_TYPE_HSPAP: return true; // ~ 10-20 Mbps case TelephonyManager.NETWORK_TYPE_IDEN: return false; // ~25 kbps case TelephonyManager.NETWORK_TYPE_LTE: return true; // ~ 10+ Mbps case TelephonyManager.NETWORK_TYPE_UNKNOWN: return false; default: return false; } }

总结:整个流程走下来我们先通过ConnectivityManager来判断是否连接上网络==》是wifi、以太网还是mobile,在通过TelephonyManager来判断移动网络的类型。

参考:http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2014/0607/1621.html

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
待兔 待兔
4个月前
手写Java HashMap源码
HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程HashMap的使用教程22
无线AP以及其与无线路由器的区别
它是传统有线网络中的集线器,也是组建小型无线局域网时最常用的设备。AP(https://www.ruijie.com.cn/cp/wx/)相当于连接有线网络和无线网络的桥梁,主要作用是将所有无线网络客户端连接在一起,然后将无线网络连接到以太网。大
Souleigh ✨ Souleigh ✨
3年前
前端性能优化 - 雅虎军规
无论是在工作中,还是在面试中,web前端性能的优化都是很重要的,那么我们进行优化需要从哪些方面入手呢?可以遵循雅虎的前端优化35条军规,这样对于优化有一个比较清晰的方向.35条军规1.尽量减少HTTP请求个数——须权衡2.使用CDN(内容分发网络)3.为文件头指定Expires或CacheControl,使内容具有缓存性。4.避免空的
Stella981 Stella981
3年前
Android 连接到网络
连接到网络这一节将告诉你如何实现一个连接到网络的简单的应用程序。它说明了一些最佳的实践,即使是在创建最简单的联网app时也应该遵守的。注意,要执行本节所描述的网络操作,你的应用的manifest必须包含如下的permissions:<usespermissionandroid:name"android.permissio
Stella981 Stella981
3年前
Android Volley完全解析(一),初识Volley的基本用法
1\.Volley简介我们平时在开发Android应用的时候不可避免地都需要用到网络技术,而多数情况下应用程序都会使用HTTP协议来发送和接收网络数据。Android系统中主要提供了两种方式来进行HTTP通信,HttpURLConnection和HttpClient,几乎在任何项目的代码中我们都能看到这两个类的身影,使用率
Stella981 Stella981
3年前
Android检查设备是否可以访问互联网,判断Internet连接,测试网络请求,解析域名
安卓SDK提供了ConnectivityManager类,那么我们就可以轻松的获取设备的网络状态以及联网方式等信息。 但是要想知道安卓设备连接的网络能不能访问到Internet,就要费一番周折了。 本文为大家介绍三种方式来检查Internet连接状态。1、使用Linux系统pingip的命令方式检查设备的Internet连接状态。 2
Wesley13 Wesley13
3年前
ThinkPHP 根据关联数据查询 hasWhere 的使用实例
很多时候,模型关联后需要根据关联的模型做查询。场景:广告表(ad),广告类型表(ad\_type),现在需要筛选出广告类型表中id字段为1且广告表中status为1的列表先看关联的设置部分 publicfunctionadType(){return$thisbelongsTo('A
Python进阶者 Python进阶者
10个月前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这