我有一个应用程序,它必须听特定的短信。到目前为止容易。Android - 接收长短信(多部分)
但是,当我收到消息时,它是多部分。有没有合适的方式接收短信作为一条消息?
现在我的活动开始两次,每个部分的短信。我应该手动连接短信吗?
我有一个应用程序,它必须听特定的短信。到目前为止容易。Android - 接收长短信(多部分)
但是,当我收到消息时,它是多部分。有没有合适的方式接收短信作为一条消息?
现在我的活动开始两次,每个部分的短信。我应该手动连接短信吗?
看看gTalkSMS如何处理传入的SMS可能是有用的,因为它似乎正确地处理多部分消息。
非常感谢这个链接,这真的很有帮助。链接中的RetrieveMessages方法帮助我将所有多部分消息集中在一个中。 – 2015-05-01 12:46:34
是的,你应该手动连接短信,但显然你不想为每个消息段启动一项新的活动。
我建议将您的活动的launchMode
属性设置为singleTask
或singleInstance
以便不会发生。
或者您的短信由Service
接收,只有当它有完整的信息时才会触发新的Activity
。
我不知道如何将一个多部分信息重新调用一次。但是,如果您拥有正确的意向过滤器设置,则只能获得一个意图超过一个 SMS。实际上,意图可以包含来自不同发件人的SMS和零个或多个多部分SMS。
你可以试试这个方法:
添加SmsReceiver类与清单android.provider.Telephony.SMS_RECEIVED意图过滤器。
onReceive方法的类将得到一个pdus包的意图。这些pdu可以来自不同的发送者,并且/或者在多部分文本消息的情况下可以来自同一个发送者的更多的pdus,您必须将它们连接起来。
Bundle bundle = intent.getExtras();
Object[] pdus = (Object[]) bundle.get("pdus");
messages = new SmsMessage[pdus.length];
for (int i = 0; i < pdus.length; i++)
{
messages[i] =
SmsMessage.createFromPdu((byte[]) pdus[i]);
}
SmsMessage sms = messages[0];
try {
if (messages.length == 1 || sms.isReplace()) {
body = sms.getDisplayMessageBody();
} else {
StringBuilder bodyText = new StringBuilder();
for (int i = 0; i < messages.length; i++) {
bodyText.append(messages[i].getMessageBody());
}
body = bodyText.toString();
}
} catch (Exception e) {
}
较短的解决方案:
if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) {
Bundle bundle = intent.getExtras(); //---get the SMS message passed in---
SmsMessage[] msgs = null;
if (bundle != null) {
//---retrieve the SMS message received---
try {
Object[] pdus = (Object[]) bundle.get("pdus");
msgs = new SmsMessage[pdus.length];
String msgBody = "";
String msg_from = "";
for (int i = 0; i < msgs.length; i++) {
msgs[i] = SmsMessage.createFromPdu((byte[]) pdus[i]);
msg_from = msgs[i].getOriginatingAddress();
msgBody += msgs[i].getMessageBody();
}
} catch (Exception e) {
// Log.d("Exception caught",e.getMessage());
}
}
}
这似乎是一个愚蠢的问题,而是有没有办法缩短听了消息,低于160个字符? – Phobos 2010-11-30 03:14:47
nope;)不由我发送。 – Danail 2010-11-30 04:40:47