我有一個應用程序,它必須聽特定的短信。到目前爲止容易。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