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

