收到的短信未在 TextView 中完全显示

Received SMS not displaying completely in TextView

我一直在尝试创建一个简单的应用程序,它将 SMS 发送到信息网关,并且还能够在应用程序内显示收到的关于所请求信息的 SMS。

前半句我都答对了,后半句少了点东西,就是接收短信。我已经成功地能够使用 mThis 访问另一个 class 上的 TextView,但我无法获取完整的消息,只能获取其中的一小段。

下面放几张截图让大家明白:

在这里,我正在维基百科上搜索 MJ,完成后,会向我发送一条维基文章文本版本的消息。

这是我从网关收到的消息,一篇关于我最喜欢的艺术家的简短而甜蜜的文章。

但这就是我得到的...整个消息的缩短版本,有时甚至是不完整的版本,这对某些搜索没有意义。

这是我在 ReceiveMessage.java 上的代码,主要 class 文件允许我接收和显示短信。

package com.phoenix.omnisurf;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;

public class ReceiveMessage extends BroadcastReceiver {

private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
private static final String TAG = "SMSBroadcastReceiver";

@Override
public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals(SMS_RECEIVED)) {
        Bundle bundle = intent.getExtras();
        if (bundle != null) {
            Object[] pdus = (Object[])bundle.get("pdus");
            final SmsMessage[] messages = new SmsMessage[pdus.length];
            for (int i = 0; i < pdus.length; i++) {
                messages[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
            }
            if (messages.length > -1) {
                Surf.mThis.messageContainer.setText(messages[0].getDisplayMessageBody());
            }
        }
    }
}
}

这是我的 activity_surf.xml 包含的主要布局,它具有显示接收到的消息的 messageContainer TextView。 (只是一小段

<TextView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/messageContainer"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_alignParentRight="true"
    android:layout_alignParentEnd="true"
    android:layout_alignParentBottom="true"
    android:padding="20dp"
    android:layout_below="@+id/btnSurf" />

请帮我在应用程序上显示完整的消息,我将不胜感激。非常感谢!

当时我没有意识到,SMS 是按块(在 PDU 中)发送的,而我所做的只是读取第一个数组 messages[0]的邮件正文。

我所要做的就是实现相同的 for 循环来捕获所有消息并将其用于 store/append 所有消息到一个字符串变量 messageBody.

我还必须在每次收到新短信时清除 messageBody,这样它就不会一直显示旧短信。

这是新的改进代码:

package com.phoenix.omnisurf;

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;

public class ReceiveMessage extends BroadcastReceiver {

private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
private static final String TAG = "SMSBroadcastReceiver";
private String messageBody = "";

@Override
public void onReceive(Context context, Intent intent) {
    if (intent.getAction().equals(SMS_RECEIVED)) {
        Bundle bundle = intent.getExtras();
        if (bundle != null) {

            messageBody = "";

            Object[] pdus = (Object[])bundle.get("pdus");
            final SmsMessage[] messages = new SmsMessage[pdus.length];

            for (int i = 0; i < pdus.length; i++) {
                messages[i] = SmsMessage.createFromPdu((byte[])pdus[i]);
            }

            if (messages.length > -1) {
                for (int i = 0; i < pdus.length; i++) {
                    messageBody += (messages[i].getDisplayMessageBody());
                }
            }

            Surf.mThis.messageContainer.setText(messageBody);
        }
    }
}
}

回应楼主自己的回答,少了一个for循环。

import android.content.BroadcastReceiver;
import android.content.Context;
import android.content.Intent;
import android.os.Bundle;
import android.telephony.SmsMessage;

public class ReceiveMessage extends BroadcastReceiver {

    private static final String SMS_RECEIVED = "android.provider.Telephony.SMS_RECEIVED";
    private static final String TAG = "SMSBroadcastReceiver";
    private String messageBody = "";

    @Override
    public void onReceive(Context context, Intent intent) {
        if (intent.getAction().equals(SMS_RECEIVED)) {
            Bundle bundle = intent.getExtras();
            if (bundle != null) {

                messageBody = "";

                Object[] pdus = (Object[])bundle.get("pdus");
                final SmsMessage[] messages = new SmsMessage[pdus.length];

                for (int i = 0; i < pdus.length; i++) {
                    messageBody += SmsMessage.createFromPdu((byte[])pdus[i]).getDisplayMessageBody();
                }

                Surf.mThis.messageContainer.setText(messageBody);
            }
        }
    }
}