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

简介: 很多时候需要先判断当前用户的网络,才会继续之后的一些处理逻辑。但网络类型获取这一块,我用我自己的的手机调试时遇到一些问题,这里记录一下。 一加手机一代,移动4G 网络,得到的subtype类型值为17,我查过Android 5.1的源码,它最大的值也就为16。

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

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

 

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

 

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

魅族MX4联通3G

 

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

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

 

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

 

 

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

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

目录
相关文章
|
1月前
|
数据库 Android开发 开发者
构建高效Android应用:采用Kotlin协程优化网络请求处理
【2月更文挑战第30天】 在移动应用开发领域,网络请求的处理是影响用户体验的关键环节。针对Android平台,利用Kotlin协程能够极大提升异步任务处理的效率和简洁性。本文将探讨如何通过Kotlin协程优化Android应用中的网络请求处理流程,包括协程的基本概念、网络请求的异步执行以及错误处理等方面,旨在帮助开发者构建更加流畅和响应迅速的Android应用。
|
1月前
|
网络协议 Linux Shell
搭建虚拟机的网络布局类型和配置操作
搭建虚拟机的网络布局类型和配置操作
|
3月前
|
机器学习/深度学习 算法 计算机视觉
基于GoogleNet深度学习网络的花朵类型识别matlab仿真
基于GoogleNet深度学习网络的花朵类型识别matlab仿真
|
3月前
|
Android开发 Python
Python封装ADB获取Android设备wifi地址的方法
Python封装ADB获取Android设备wifi地址的方法
61 0
|
3月前
|
安全 API Android开发
Android网络和数据交互: 解释Retrofit库的作用。
Android网络和数据交互: 解释Retrofit库的作用。
38 0
|
3月前
|
Android开发 开发者
Android网络和数据交互: 请解释Android中的AsyncTask的作用。
Android网络和数据交互: 请解释Android中的AsyncTask的作用。
22 0
|
1天前
|
移动开发 Java Android开发
构建高效Android应用:采用Kotlin协程优化网络请求
【4月更文挑战第24天】 在移动开发领域,尤其是对于Android平台而言,网络请求是一个不可或缺的功能。然而,随着用户对应用响应速度和稳定性要求的不断提高,传统的异步处理方式如回调地狱和RxJava已逐渐显示出局限性。本文将探讨如何利用Kotlin协程来简化异步代码,提升网络请求的效率和可读性。我们将深入分析协程的原理,并通过一个实际案例展示如何在Android应用中集成和优化网络请求。
|
2天前
|
Android开发
Android RIL 动态切换 4G 模块适配
Android RIL 动态切换 4G 模块适配
6 0
|
9天前
|
Android开发 开发者
Android网络和数据交互: 请解释Android中的AsyncTask的作用。
Android&#39;s AsyncTask simplifies asynchronous tasks for brief background work, bridging UI and worker threads. It involves execute() for starting tasks, doInBackground() for background execution, publishProgress() for progress updates, and onPostExecute() for returning results to the main thread.
10 0
|
9天前
|
网络协议 安全 API
Android网络和数据交互: 什么是HTTP和HTTPS?在Android中如何进行网络请求?
HTTP和HTTPS是网络数据传输协议,HTTP基于TCP/IP,简单快速,HTTPS则是加密的HTTP,确保数据安全。在Android中,过去常用HttpURLConnection和HttpClient,但HttpClient自Android 6.0起被移除。现在推荐使用支持TLS、流式上传下载、超时配置等特性的HttpsURLConnection进行网络请求。
9 0

热门文章

最新文章