Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >Android判断用户的网络类型(2/3/4G、wifi)

Android判断用户的网络类型(2/3/4G、wifi)

作者头像
meteoric
发布于 2018-11-19 10:16:30
发布于 2018-11-19 10:16:30
1.7K00
代码可运行
举报
文章被收录于专栏:游戏杂谈游戏杂谈
运行总次数:0
代码可运行

很多时候需要先判断当前用户的网络,才会继续之后的一些处理逻辑。但网络类型获取这一块,我用我自己的的手机调试时遇到一些问题,这里记录一下。

一加手机一代,移动4G 网络,得到的subtype类型值为17,我查过Android 5.1的源码,它最大的值也就为16。(点击这里在线查看源码>>)

我拿魅族的移动4G测试的结果如下:

小米4,电信4G的测试结果如下:

魅族MX4,联通3G

还测试了其它华为移动3G/4G的情况,就我自己的手机一加返回的值有点奇怪,之后我查了一下它的参数:http://detail.zol.com.cn/374/373908/param.shtml

当然,其它厂商:华为、小米、魅族与上面显示的网络类型基本上是一致的。都是3G:TD-SCDMA、WCDMA等

而目前测试的情况就是仅一加返回的值为17,这会导致正常的判断出现问题,无法识别到底使用的是何种网络。而我通过logcat的日志,却很清晰的发现系统自己是能识别的

最后我根据网络上提供的资料,加了一项比较特殊的判断,演变成如下的代码:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
public static String GetNetworkType()
{
    String strNetworkType = "";
    
    NetworkInfo networkInfo = (ConnectivityManager) getSystemService(Context.CONNECTIVITY_SERVICE).getActiveNetworkInfo();
    if (networkInfo != null && networkInfo.isConnected())
    {
        if (networkInfo.getType() == ConnectivityManager.TYPE_WIFI)
        {
            strNetworkType = "WIFI";
        }
        else if (networkInfo.getType() == ConnectivityManager.TYPE_MOBILE)
        {
            String _strSubTypeName = networkInfo.getSubtypeName();
            
            Log.e("cocos2d-x", "Network getSubtypeName : " + _strSubTypeName);
            
            // TD-SCDMA   networkType is 17
            int networkType = networkInfo.getSubtype();
            switch (networkType) {
                case TelephonyManager.NETWORK_TYPE_GPRS:
                case TelephonyManager.NETWORK_TYPE_EDGE:
                case TelephonyManager.NETWORK_TYPE_CDMA:
                case TelephonyManager.NETWORK_TYPE_1xRTT:
                case TelephonyManager.NETWORK_TYPE_IDEN: //api<8 : replace by 11
                    strNetworkType = "2G";
                    break;
                case TelephonyManager.NETWORK_TYPE_UMTS:
                case TelephonyManager.NETWORK_TYPE_EVDO_0:
                case TelephonyManager.NETWORK_TYPE_EVDO_A:
                case TelephonyManager.NETWORK_TYPE_HSDPA:
                case TelephonyManager.NETWORK_TYPE_HSUPA:
                case TelephonyManager.NETWORK_TYPE_HSPA:
                case TelephonyManager.NETWORK_TYPE_EVDO_B: //api<9 : replace by 14
                case TelephonyManager.NETWORK_TYPE_EHRPD:  //api<11 : replace by 12
                case TelephonyManager.NETWORK_TYPE_HSPAP:  //api<13 : replace by 15
                    strNetworkType = "3G";
                    break;
                case TelephonyManager.NETWORK_TYPE_LTE:    //api<11 : replace by 13
                    strNetworkType = "4G";
                    break;
                default:
                    // http://baike.baidu.com/item/TD-SCDMA 中国移动 联通 电信 三种3G制式
                    if (_strSubTypeName.equalsIgnoreCase("TD-SCDMA") || _strSubTypeName.equalsIgnoreCase("WCDMA") || _strSubTypeName.equalsIgnoreCase("CDMA2000")) 
                    {
                        strNetworkType = "3G";
                    }
                    else
                    {
                        strNetworkType = _strSubTypeName;
                    }
                    
                    break;
             }
             
            Log.e("cocos2d-x", "Network getSubtype : " + Integer.valueOf(networkType).toString());
        }
    }
    
    Log.e("cocos2d-x", "Network Type : " + strNetworkType);
    
    return strNetworkType;
}

希望对需要的人有所帮助吧。我在网上搜索到,之前其实有人提出过类似的疑问,但是没有答案:

telephony.getNetworkType() 这个方法为什么在有些手机里面获取的值API没有呢,例如16、17。这两个在 TelephonyManager这个API里面就没有 http://a.code4app.com/qa/q/55237d8b933bf062538b4f5d

参考链接:

How to determine if network type is 2G, 3G or 4G

Comparison of wireless data standards

Android 判断用户2G/3G/4G移动数据网络

TD-SCDMA

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2015-07-07 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
编辑精选文章
换一批
Android | 网络类型判断工具类
在 Android 中获取网络类型时,我们通常先使用 ConnectivityManager.getActiveNetworkInfo() 判断是不是 Wifi , 再通过 TelephonyManager.getNetworkType() 判断具体是 3G 还是 4G。
CnPeng
2021/02/03
5K0
Android如何判断当前网络类型(联网,2g,3g,wifi等)
一般对网络的判断都是判断是否联网,不过有时候我们需要知道具体的网络类型,比如在3g网络下,百度地图的定位功能存在很大的偏差,这就需要提前判断网络类型针对3g网络情况做特殊的处理。
程思扬
2022/01/10
1.7K0
Android获取设备各项信息(设备id、ip地址、设备名称、运行商、品牌、型号、分辨率、处理器、国家码、系统语言、网络类型、oaid、android版本、操作系统版本、mac地址、应用程序签名..)
Android获取设备各项信息(设备id、ip地址、设备名称、运行商、品牌、型号、分辨率、处理器、国家码、系统语言、网络类型、oaid、android版本、操作系统版本、mac地址、应用程序签名......) 获取设备id 获取ip地址 获取设备名称 获取设备型号 获取设备处理器 获取设备品牌 获取设备制造商 获取设备oaid 获取设备识别码 获取mac地址 获取应用包名 获取应用签名 获取app版本 获取版本号 获取分辨率 获取国家码 获取系统语言 获取设备网络代码 获取设备网络类型 获取android版
是阿超
2021/12/30
5.6K0
android 网络实时监听网络状态变化 及 网络类型判断
android 中 我们经常需要判断 各种网络类型   然后需要给用户做出相应的提示,一般网络类型有 2g ,3g,4g ,wifi,无网络等等。
再见孙悟空_
2023/02/10
2.3K0
XYLibrary笔记九:XNewWork使用笔记
一.代码 XTester-network xlib-Network 二.demo 三.方法 打开网络设置界面 /** * Open the settings of wireless. */ public static void openWirelessSettings() { getApp().startActivity( new Intent(android.provider.Settings.ACTION_WIRELESS_SETTINGS)
项勇
2023/03/24
4180
XYLibrary笔记九:XNewWork使用笔记
Android获取网络状态
前言:在开发安卓移动端时,几乎每一个app都需要连接网络,因此,对设备的网络状态检测是很有必要的!比如:检测当前网络是否可用,当前可用的网络是属于WIFI还是MOBILE等等。
AlicFeng
2019/02/22
3.4K0
android 监听网络状态的变化及实战
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/gdutxiaoxu/article/details/53008266
程序员徐公
2018/09/17
4.9K0
android 监听网络状态的变化及实战
Android项目实战(五十三):判断网络连接是否为有线状态(tv项目适配)
  注意的是对于Tv项目,android系统的Tv(比如小米电视),有的是支持有线连接的(非wifi,2g 3g 4g)的 , 此时上述方法会判断为0,无网络连接状态,所以对于Tv项目,需要对网络适配进行兼容
听着music睡
2018/12/28
1.6K0
BroadcastReceiver获取手机网络状态
public class NetReceiver extends BroadcastReceiver { /** * 枚举网络状态 NET_NO:没有网络 NET_2G:2g网络 NET_3G:3g网络 NET_4G:4g网络 NET_WIFI:wifi * NET_UNKNOWN:未知网络 */ public static enum NetState { NET_NO, NET_2G, NET_3G, NET_4G,NET_WIFI, NET_MOBILE, NET_UNKNOWN
张拭心 shixinzhang
2022/05/06
6730
android 获取设备信息
//手机号码 public static String getLine1Number(Context context) { TelephonyManager tm = (TelephonyManager) context.getSystemService(Context.TELEPHONY_SERVICE); if (tm == null) { return ""; } return "" + tm.getLine1
再见孙悟空_
2023/02/10
1.7K0
TD-SCDMA/GSM是啥意思,移动,联通,电信的4G网络制式
移动的网络制式是GSM、TD-SCDMA、TD-LTE (2G.3G.4G) 联通的网络制式是GSM、WCDMA、FDD-LTE与TD-LTE融合(2G.3G.4G) 电信的网络制式是CDMA、CDMA2000、TD-LTE和FDD-LTE融合(2G.3G.4G)
全栈程序员站长
2022/09/06
3K0
CDMA是什么网络类型_TD_LTE移动电话机
全球移动通信系统(Global System for Mobile Communications) ,缩写为GSM,由欧洲电信标准组织ETSI制订的一个数字移动通信标准。它的空中接口采用时分多址技术 。自90年代中期投入商用以来,被全球超过100个国家采用。GSM标准的无处不在使得在移动电话运营商之间签署”漫游协定”后用户的国际漫游变得很平常。 GSM 较之它以前的标准最大的不同是它的信令和语音信道都是数字式的,因此GSM被看作是第二代 (2G)移动电话系统 。
全栈程序员站长
2022/11/09
1.5K0
CDMA是什么网络类型_TD_LTE移动电话机
4G LTE Advanced_LTE百科
IS-95是由高通公司发起的第一个基于CDMA数字蜂窝标准。IS全称为Interim Standard,即暂时标准,基于IS-95的第一个品牌是cdmaOne。IS-95也叫TIA-EIA-95。它是一个使用CDMA的2G移动通信标准,一个数据无线电多接入方案,其用来发送声音,数据和在无线电话和蜂窝站点间发信号数据(如被拨电话号码)。IS-95及其相关标准是最早商用的基于CDMA技术的移动通信标准,它或者它的后继CDMA2000也经常被简称为CDMA。
全栈程序员站长
2022/11/09
6070
三大运营商网络使用频段及随身wifi选用
关于市面上常见的wifi仍然是4G模式的,5G模式记得刚出来的时候也有,都快上千了,没必要。
全栈程序员站长
2022/11/01
8.5K0
移动终端处理器构成和基带芯片概述「建议收藏」
一部手机要实现最主要的功能—打电话发短信,这个手机就要包含下面几个部分:射频部分、基带部分、电源管理、外设、软件等。回想一下移动手机的发展史:
全栈程序员站长
2022/07/08
1.8K0
Android SecurityException: getDataNetworkTypeForSubscriber问题修复
前不久,在开发Android视频播放器的时候,使用手机的4G播放时出现了getDataNetworkTypeForSubscriber错误,详细的报错信息如下:
xiangzhihong
2022/11/30
2K0
5G之争
西方针对华为不是一天两天。新西兰、澳大利亚均封杀华为设备、拒绝让华为参加该国建立5G移动网络投标;华为在英国的国际业务也面临所谓“技术担忧”,英国电信近日亦禁止华为参与竞标公司核心5G网络设备的供应合同。
小小詹同学
2018/12/25
6400
5G之争
4G演进之路:FDD还是TDD?[通俗易懂]
大家好,又见面了,我是你们的朋友全栈君。达到更高频谱利用率、覆盖率,同时保证多媒体应用的QoS服务质量,已经成为第四代蜂窝4G网络的挑战和目标。在4G系统里,有许多关于物理层和多接入以提高频谱利用率方面的研究,以支持高达100Mbps甚至更高的数据传输速率。例如,正交频分多址OFDMA、MIMO天线,以及跨层资源优化,被认为是4G系统中的核心技术,并同时在频率选择的衰落信道中提供高可靠通信。
全栈程序员站长
2022/09/01
2K0
4G演进之路:FDD还是TDD?[通俗易懂]
IOS判断用户的网络类型(2/3/4G、wifi)
直接贴代码吧,ios7之后是获取的较为准确,7以下我拿iphone5测试的是无法区分3g/2g。连iphone4都能升到7.1.4,而且目前主流的设备7以下的系统已经很少了,这个方案尽管不太完美,但影响不会太大
meteoric
2018/11/19
1.1K0
Android工具类整合「建议收藏」
Android-JSONUtil工具类 常用的Json工具类,包含Json转换成实体、实体转json字符串、list集合转换成json、数组转换成json
全栈程序员站长
2022/08/31
1.1K0
推荐阅读
相关推荐
Android | 网络类型判断工具类
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验