华为 nova 6(5g)利用 TelephonyManager.getNetworkType()函数无法获取网络类型,返回值总是 0(即无法判断网络类型),请问原因是什么?

2020-01-07 10:57:42 +08:00
 oven

利用 TelephonyManager.getNetworkType()函数获取网络类型的代码:

// 这里的 context 参数是在 MainActivity 中初始化,为:
//        Context context = this;
// 然后传入下面的代码所在的函数。
TelephonyManager manager =  (TelephonyManager)
               context.getSystemService(Context.TELEPHONY_SERVICE);
int networkType = manager.getNetworkType();
switch (networkType) {
    case TelephonyManager.NETWORK_TYPE_UNKNOWN:
        return "unknown";
    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:
        return "2G";
    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:
    case TelephonyManager.NETWORK_TYPE_EHRPD:
    case TelephonyManager.NETWORK_TYPE_HSPAP:
        return "3G";
    case TelephonyManager.NETWORK_TYPE_LTE:
        return "4G";
    case TelephonyManager.NETWORK_TYPE_NR:
        return "5G";
    default:
        return String.valueOf(networkType);
    }
}

配置:

另外我还尝试了 ConnectivityManager.getActiveNetworkInfo().getSubtype()方法,这个可以识别 4G 网络,但是连接到 5G 网络时仍然返回是 4G 网络。

所以,请问我的代码是否有错误?有没有其他方法可以正确判断当前是 4G/5G 网络?

7292 次点击
所在节点    Android
14 条回复
torchmu
2020-01-07 11:55:28 +08:00
READ_PHONE_STATE 权限有获取么?
oven
2020-01-07 12:49:59 +08:00
@torchmu 没有,我看文档只需要获取 ACCESS_NETWORK_STATE。
oven
2020-01-07 12:51:39 +08:00
@torchmu 加上这个权限之后还是不行
psyche08
2020-01-07 16:35:51 +08:00
This method was deprecated in API level 29. Use TelephonyManager.getDataNetworkType() instead.
better
2020-02-24 17:35:37 +08:00
有任何进展吗?也遇到这个问题
oven
2020-03-04 20:29:14 +08:00
@better 没有找到有效的方法,一个在考虑方案是用监听网络状态的 API。老哥用的是什么手机,操作系统版本是什么样的?
oven
2020-03-04 20:46:45 +08:00
@psyche08 这个方法试过了,也不行
better
2020-03-08 10:10:23 +08:00
@oven huawei mate 30 pro 5g ,android 10。试了这几个方式都无法获取
1. NetworkInfo#getSubtype()
2. TelephonyManager#getNetworkType()
3. TelephonyManager#getDataNetworkType()
4. 通过 TelephonyManager.getAllCellInfo(),获取 5G 网络的两种模式 SA NSA,
5. 通过 TelephonyManager.getServiceState,检查 ServiceState.getNrStatus() 返回值是否等于 3

目前的 5G 信号,可能是 4G+的形式,就是厂商自己定义的 5G 信号。猜测还没有适配 Google 的代码吧。
oven
2020-03-08 17:16:10 +08:00
better
2020-03-10 13:13:49 +08:00
@oven 这个我试了,对应第 5 个方式。也无法获取
oven
2020-03-10 17:09:08 +08:00
@better 可能是华为手机的原因,其他品牌的可能可行
oven
2020-03-16 08:49:12 +08:00
@better 老哥有进展的话麻烦告知下
oven
2020-03-18 12:05:00 +08:00
@better 老哥,我看到一个博客说在华为 mate30 5G 版找到了可行的办法,利用的是华为自定义的接口。链接: https://blog.csdn.net/alee_130158/article/details/103200027,我现在没有手机,没办法测试。如果可以的话希望你能测试一下,分享一下结果。多谢了
better
2020-03-22 20:45:58 +08:00
@oven 目前没有新的进展,我这部华为手机被寄回去了。后面我在看下这个

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/635712

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX