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

时间:2015-01-31 02:45:15

标签: android android-intent textview sms broadcastreceiver

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

我的第一部分是正确的,但下半部分缺少一些东西,即接收短信。我已经成功地使用mThis访问TextView到另一个类,但是我无法获得完整的消息,只有一小部分消息。

以下是一些让您了解的截图:

Here, I'm doing a Wikipedia Search for MJ, and once that is done, a message of the text-version of the Wiki Article is sent to me.

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

This is the message I got from the gateway, a short and sweet article about my favorite artist.

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

But this is what I get... a shortened and sometimes incomplete version of the whole message, which doesn't make sense for some searches.

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

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

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" />

请帮助我在应用程序上显示完整的消息,我真的很感激。非常感谢你!

2 个答案:

答案 0 :(得分:1)

在回复原创海报自己的答案时,这只是一个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);
            }
        }
    }
}

答案 1 :(得分:0)

我当时没有意识到,SMSs是以块(PDU)发送的,而我正在做的只是读取第一个数组消息[0] 的消息体

我所要做的就是实现相同的for循环来捕获所有消息并使用它来存储/附加所有消息到一个字符串变量 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);
        }
    }
}
}