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

Flutter中如何获取接收短信的SIM卡及接收方号码?

Flutter短信相关问题解决方案

1. 获取短信接收方号码

sms 包的 SmsMessage 类字段逻辑和系统短信存储规则绑定:

  • 若你读取的是已发送短信,直接调用 message.address 就能拿到接收方号码
  • 若你读取的是收件箱短信,系统不会把当前设备的号码存入短信记录,接收方信息需要通过获取当前SIM卡号码来补充(见第二个问题)

如果sms包无法满足需求,可通过MethodChannel调用Android原生API查询短信数据库:
Android短信数据库路径为content://sms/,其中sent表的address字段就是接收方号码,原生Kotlin实现示例:

val cursor = contentResolver.query(
    Uri.parse("content://sms/sent"),
    arrayOf("_id", "address", "body"),
    null,
    null,
    "date DESC"
)
cursor?.use {
    while (it.moveToNext()) {
        val recipientNum = it.getString(it.getColumnIndexOrThrow("address"))
        // 将号码通过MethodChannel传回Flutter
    }
}

2. 识别接收短信的SIM卡并获取其号码

识别短信所属SIM卡

优先尝试sms包自带的字段:

SmsMessage message = // 你的短信对象;
int simSlotIndex = message.simSlot; // 返回0或1,对应卡槽位置(部分设备支持)

若字段无效,需通过原生读取短信的sub_id字段,再结合SubscriptionManager匹配SIM卡信息:

// 读取短信的sub_id
val cursor = contentResolver.query(
    Uri.parse("content://sms/inbox"),
    arrayOf("_id", "sub_id"),
    null,
    null,
    null
)
cursor?.use {
    if (it.moveToNext()) {
        val subId = it.getInt(it.getColumnIndexOrThrow("sub_id"))
        // 用subId匹配SIM卡信息
    }
}

获取SIM卡号码

通过原生代码获取激活状态的SIM卡信息,绑定卡槽与号码:

val subscriptionManager = getSystemService(Context.TELEPHONY_SUBSCRIPTION_SERVICE) as SubscriptionManager
val activeSubs = subscriptionManager.activeSubscriptionInfoList
activeSubs.forEach { info ->
    val simNumber = info.number // SIM卡号码
    val slotIndex = info.simSlotIndex // 对应卡槽
    // 存储映射关系,供Flutter端调用
}

注意事项

  • Android端需在AndroidManifest.xml添加权限:READ_SMS、READ_PHONE_STATE,并动态申请权限
  • 部分机型因隐私限制,可能无法读取SIM卡号码;iOS系统对短信和SIM卡信息读取限制更严格,上述方案主要适配Android

内容的提问来源于stack exchange,提问作者Tejas Gaikwad

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 21:01:40