我一直在尝试创建一个简单的应用程序,它将SMSes发送到信息网关,并且还能够在应用程序中显示收到的有关所请求信息的SMS。
我的第一部分是正确的,但下半部分缺少一些东西,即接收短信。我已经成功地使用mThis访问TextView到另一个类,但是我无法获得完整的消息,只有一小部分消息。
以下是一些让您了解的截图:
在这里,我正在为MJ做维基百科搜索,一旦完成,就会向我发送一条维基文章文本版本的消息。
这是我从网关收到的一条消息,这是一篇关于我最喜欢的艺术家的简短而精彩的文章。
但这就是我得到的...整个消息的缩短且有时不完整的版本,对某些搜索没有意义。
这是我在 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" />
请帮助我在应用程序上显示完整的消息,我真的很感激。非常感谢你!
答案 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);
}
}
}
}