Kotlin中SmsMessage接收带#短信时内容拆分问题咨询
解决SmsMessage拆分含#短信内容的问题
你遇到的这种情况大概率是特定场景下的系统解析异常——部分运营商或短信服务会将#作为特殊分隔标记,导致SmsMessage错误地将内容拆分到getDisplayMessageBody()和getMessageBody()中。
获取完整短信内容的几种实用方法:
1. 直接拼接两个方法的返回值
针对你遇到的拆分场景,可以直接判断两个方法的返回值是否为空,拼接得到完整内容:
val smsMessage: SmsMessage = // 你的SmsMessage实例 val fullContent = when { smsMessage.displayMessageBody.isNotEmpty() && smsMessage.messageBody.isNotEmpty() -> "${smsMessage.displayMessageBody}${smsMessage.messageBody}" else -> smsMessage.displayMessageBody.ifEmpty { smsMessage.messageBody } }
注意:如果拆分时中间存在空格(比如你的示例场景),可以根据实际情况调整拼接的分隔符。
2. 从原始PDU重新解析
如果拼接方法失效,可以直接获取短信的原始PDU数据,重新解析得到完整内容:
val smsMessage: SmsMessage = // 你的SmsMessage实例 val pdu = smsMessage.pdu ?: "" val format = smsMessage.format val fullMessage = SmsMessage.createFromPdu(pdu, format)?.let { it.messageBody ?: it.displayMessageBody } ?: ""
3. 处理分段长短信(通用场景)
如果是长短信被拆分为多个段,需要从广播Intent中获取所有短信段并拼接:
// 在广播接收器的onReceive方法中 val messages = SmsMessage.getMessagesFromIntent(intent) val fullContent = buildString { messages.forEach { append(it.messageBody) } }
关于设计初衷的说明
SmsMessage的getMessageBody()本应返回原始短信内容,getDisplayMessageBody()返回经过适配显示的内容(比如替换特殊编码),正常情况下两者内容一致。你遇到的拆分情况属于特定解析逻辑的异常,确实不符合该类的设计预期。
内容的提问来源于stack exchange,提问作者Mouz
相关产品推荐
相关产品推荐

