Flutter集成Kotlin获取双卡SIM号码时遭遇NoSuchMethodError问题
解决Android原生获取双卡SIM号码的问题
错误原因
你调用的SubscriptionManager.getPhoneNumber(int)是Android 13(API 33)才新增的方法,而你的minSDK版本为30,在Android 11(API30)设备上系统未提供该方法,因此抛出NoSuchMethodError。
正确实现代码
直接从SubscriptionInfo对象中读取号码,该方式兼容API22及以上版本,完全适配你的minSDK30要求,同时支持双卡读取:
private fun getSimNumbers(): List<String> { val subscriptionManager = getSystemService(TELEPHONY_SUBSCRIPTION_SERVICE) as SubscriptionManager val simNumbers = mutableListOf<String>() if (ContextCompat.checkSelfPermission(this, Manifest.permission.READ_PHONE_STATE) == PackageManager.PERMISSION_GRANTED) { subscriptionManager.activeSubscriptionInfoList?.forEach { subscriptionInfo -> // 直接从SubscriptionInfo实例获取SIM号码 subscriptionInfo.number?.takeIf { it.isNotEmpty() }?.let { simNumbers.add(it) } } } else { requestPermissions(arrayOf(Manifest.permission.READ_PHONE_STATE), PERMISSION_REQUEST_CODE) } return simNumbers }
额外注意事项
- 权限限制:从Android 10(API29)开始,
READ_PHONE_STATE需动态申请,部分厂商会额外限制SIM号码读取权限,即使申请成功也可能返回空值。 - 空值处理:部分SIM卡未存储号码或运营商限制读取,必须做好空值判断避免崩溃。
- API33+适配:如果需要兼容Android13及以上版本,可添加版本判断兼容新方法:
val simNumber = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { subscriptionManager.getPhoneNumber(subscriptionInfo.subscriptionId) } else { subscriptionInfo.number }
内容的提问来源于stack exchange,提问作者pritamjoshi
相关产品推荐
相关产品推荐

