收到的短信未在 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);
}
}
}
}
我一直在尝试创建一个简单的应用程序,它将 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);
}
}
}
}