非英语短信显示为多个字符串?

时间:2015-11-15 13:30:22

标签: java android

我正在阅读我的应用程序中的短信。每当短信到达时,它就会进入应用程序并显示。

它适用于英语,但在使用古吉拉特语时,它们被分成多个字符串。

这是我的代码:

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";
                }

1 个答案:

答案 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之前的版本,那么可以减少上面的示例以删除特定于那些早期版本的代码。