获取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
相关产品推荐
相关产品推荐

