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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 15:10:14