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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.26 22:07:52