Android 获取设备支持的移动网络类型列表的API问询
Android 获取设备支持的移动网络技术列表解决方案
版本适配实现方案
- Android 12(API Level 31)及以上
直接调用系统公开APITelephonyManager.getSupportedRadioAccessFamilies(),即可获取硬件支持的所有无线接入技术常量列表,你可以按照如下规则映射为2G/3G/4G/5G分类:常量映射参考规则:
- 2G:包含
NETWORK_TYPE_GSM、NETWORK_TYPE_CDMA、NETWORK_TYPE_EDGE、NETWORK_TYPE_GPRS等 - 3G:包含
NETWORK_TYPE_UMTS、NETWORK_TYPE_HSPA、NETWORK_TYPE_EVDO_0、NETWORK_TYPE_TD_SCDMA等 - 4G:对应
NETWORK_TYPE_LTE、NETWORK_TYPE_LTE_CA - 5G:对应
NETWORK_TYPE_NR
- 2G:包含
- Android 11(API Level 30)及以下
系统没有公开直接获取全量支持网络的API,可通过两种兼容方案实现:- 读取系统内置配置资源
调用context.getResources().getIdentifier("config_supported_network_types", "array", "android")获取资源ID,再读取对应的整型数组做常量映射。这个配置是系统设置界面展示支持网络类型的数据源,绝大多数厂商ROM都适配了该配置,准确性较高。 - 可用网络反推
如果读取系统资源失败,可申请ACCESS_FINE_LOCATION权限后调用TelephonyManager.getAvailableNetworks(),遍历返回的当前区域可搜索到的网络信息,反推设备支持的网络类型。注意该方案依赖当前区域的网络覆盖,硬件支持但无覆盖的网络类型可能漏判,建议做降级兼容处理。
- 读取系统内置配置资源
权限要求
- 所有版本调用
TelephonyManager相关接口都需要提前申请READ_PHONE_STATE普通权限 - Android 10及以上版本调用
getAvailableNetworks()需要申请ACCESS_FINE_LOCATION危险权限 - 部分国产定制ROM会额外限制电话相关接口的调用,若返回值为空可引导用户手动授予应用「电话信息」相关权限
适配注意事项
- 不要通过当前设备驻网的网络类型判断设备全部支持能力,比如当前使用4G卡无法代表设备不支持5G
- 若遇到厂商修改了系统配置键值导致读取失败的情况,可以配合设备硬件型号白名单补充判断,比如已知一加5最高支持4G、一加9支持5G,可针对特定机型做兜底适配
内容的提问来源于stack exchange,提问作者Franco
相关产品推荐
相关产品推荐

