我正在阅读我的应用程序中的短信。每当短信到达时,它就会进入应用程序并显示。
它适用于英语,但在使用古吉拉特语时,它们被分成多个字符串。
这是我的代码:
final Object[] pdusObj = (Object[]) bundle.get("pdus");
msgs = new SmsMessage[pdusObj.length];
for (int i=0; i<msgs.length; i++) {
msgs[i] = SmsMessage.createFromPdu((byte[])pdusObj[i]);
smsReceiveTime = msgs[i].getTimestampMillis();
str += "SMS from " + msgs[i].getDisplayOriginatingAddress();
str += " :";
str += msgs[i].getDisplayMessageBody().toString();
str += "\n";
}
答案 0 :(得分:2)
...但是当古吉拉特语被分成多个字符串时
当文本消息超过最大消息长度(取决于所使用的字符集)时,它可以分解为多个部分,并作为多部分消息发送。这就是你的情况,以及你编写代码的方式,看起来你收到了几个不同的文本。
收到多部分邮件时,您最终会在SmsMessage
中找到多个onReceive()
。这些不是单独的消息,而是单个消息的部分。必须将各个机构连接在一起以汇编一条完整的信息。
以下是如何检索收到的消息,任意数量的部分,以及发件人的号码和消息的时间戳的简单示例。
@Override
public void onReceive(Context context, Intent intent) {
String number = "unknown";
StringBuilder message = new StringBuilder();
long timestamp = 0;
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
SmsMessage[] msgs = Telephony.Sms.Intents.getMessagesFromIntent(intent);
number = msgs[0].getDisplayOriginatingAddress();
timestamp = msgs[0].getTimestampMillis();
for (int i = 0; i < msgs.length; i++) {
message.append(msgs[i].getDisplayMessageBody());
}
}
else {
Object[] pdus = (Object[]) intent.getSerializableExtra("pdus");
for (int i = 0; i < pdus.length; i++) {
byte[] pdu = (byte[]) pdus[i];
SmsMessage msg = SmsMessage.createFromPdu(pdu);
if (i == 0) {
number = msg.getDisplayOriginatingAddress();
timestamp = msg.getTimestampMillis();
}
message.append(msg.getDisplayMessageBody());
}
}
String report = String.format("SMS from %s%nMessage : %s%nSent : %s",
number,
message.toString(),
DateFormat.getDateTimeInstance()
.format(new Date(timestamp)));
...
}
从KitKat开始,Telephony.Sms.Intents.getMessagesFromIntent()
方法可用于处理包含消息的Intent
额外内容。它返回一个SmsMessage
数组,我们只需要循环并提取必要的数据。
在KitKat之前,该方法尚未公开,因此我们需要自行处理。如果您不支持KitKat之前的版本,那么可以减少上面的示例以删除特定于那些早期版本的代码。