You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

获取CellInfo的MCC/MNC时调用getMccString()出现NoSuchMethodError求助

解决CellIdentityLte.getMccString()触发NoSuchMethodError的问题

我来帮你拆解这个崩溃问题,结合你给出的信息,核心原因和解决思路如下:

可能的原因

1. API版本兼容性不匹配

getMccString()和getMncString()这类字符串版本的运营商代码获取方法,是在**Android 10(API Level 29)**才被添加到CellIdentity及其子类(比如CellIdentityLte)中的。如果你的应用运行在API 28及以下版本的设备上,系统框架里根本没有这个方法,直接调用就会触发NoSuchMethodError。

你之前用的getMcc()/getMnc()虽然被标记为废弃,但它们在低版本系统中是存在的——废弃只是提示你在高版本系统中改用新方法,不代表低版本里会被移除。

2. 编译与运行环境的不一致

如果你的项目中compileSdkVersion设置的是API 29或更高(这样编译时IDE能找到新方法的定义),但运行的设备系统版本低于API 29,就会出现“编译通过但运行崩溃”的情况——因为编译时依赖的是高版本的SDK stubs,而运行时设备的系统框架没有这个方法。

3. 混淆(可排除)

你提到Debug版本下minifyEnabled false、shrinkResources false,所以代码混淆或资源压缩导致方法被移除的可能性可以直接排除。

解决方案

1. 增加API版本判断,做兼容处理

在获取MCC/MNC时,根据设备的Android版本选择对应的方法:

val cellIdentity = eachCellInfo.cellIdentity
val mcc: String? = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    cellIdentity.mccString
} else {
    // 低版本用废弃方法,但仍能正常工作
    val mccInt = cellIdentity.mcc
    if (mccInt != Integer.MAX_VALUE) mccInt.toString() else null
}

val mnc: String? = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.Q) {
    cellIdentity.mncString
} else {
    val mncInt = cellIdentity.mnc
    if (mncInt != Integer.MAX_VALUE) mncInt.toString() else null
}

2. 检查并合理配置gradle中的SDK版本

确保你的build.gradle中:

  • compileSdkVersion可以设为较高版本(比如33或34),但minSdkVersion如果低于29,必须做好上述版本兼容。
  • 避免直接调用高版本API而不做版本判断,这是Android开发中常见的兼容性陷阱。

需要补充的信息(如需进一步排查)

如果问题仍然存在,你可以提供以下信息:

  • 项目中compileSdkVersion、minSdkVersion、targetSdkVersion的具体数值
  • 崩溃发生的设备的Android版本号

内容的提问来源于stack exchange,提问作者Shubham AgaRwal

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.13 06:22:55