【问题标题】:Received SMS not displaying completely in TextView收到的短信未在 TextView 中完全显示
【发布时间】:2015-01-31 02:45:15
【问题描述】:

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

前半部分我猜对了,但后半部分缺少一些东西,即接收短信。我已经成功地能够使用 mThis 访问另一个类的 TextView,但我无法获得完整的消息,只有一小段消息。

这里有几个截图让你理解:

在这里,我正在对 MJ 进行 Wikipedia 搜索,一旦完成,就会向我发送一条 Wiki 文章文本版本的消息。

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

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

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

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。 (只是一个 sn-p

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

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

【问题讨论】:

  • 这只是一个猜测,但我敢打赌,消息正在被拆分,因为它的长度超过了 140 个字符,这是文本消息的标准长度。你需要得到下半场。
  • @bwoogie 你是对的,我在发布这个问题后就意识到了这一点。我现在已经为我自己的问题添加了一个有效的答案,请查看它并让我知道这是否是执行它的正确方法,或者是否有任何其他简化的方法来处理多个消息块。谢谢。

标签: android android-intent textview sms broadcastreceiver


【解决方案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);
            }
        }
    }
}

【讨论】:

    【解决方案2】:

    我当时没有意识到,SMS 是分块发送的(在 PDU 中),而我所做的只是读取第一个数组 messages[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);
            }
        }
    }
    }
    

    【讨论】:

      猜你喜欢
      • 2012-10-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-04-03
      • 1970-01-01
      • 1970-01-01
      • 2012-05-25
      相关资源
      最近更新 更多