2010-11-29 55 views
22

我有一個應用程序,它必須聽特定的短信。到目前爲止容易。Android - 接收長短信(多部分)

但是,當我收到消息時,它是多部分。有沒有合適的方式接收短信作爲一條消息?

現在我的活動開始兩次,每個部分的短信。我應該手動連接短信嗎?

+0

這似乎是一個愚蠢的問題,而是有沒有辦法縮短聽了消息,低於160個字符? – Phobos 2010-11-30 03:14:47

+1

nope;)不由我發送。 – Danail 2010-11-30 04:40:47

回答

20

看看gTalkSMS如何處理傳入的SMS可能是有用的,因爲它似乎正確地處理多部分消息。

+2

非常感謝這個鏈接,這真的很有幫助。鏈接中的RetrieveMessages方法幫助我將所有多部分消息集中在一箇中。 – 2015-05-01 12:46:34

1

是的,你應該手動連接短信,但顯然你不想爲每個消息段啓動一項新的活動。

我建議將您的活動的launchMode屬性設置爲singleTasksingleInstance以便不會發生。

或者您的短信由Service接收,只有當它有完整的信息時纔會觸發新的Activity

1

我不知道如何將一個多部分信息重新調用一次。但是,如果您擁有正確的意向過濾器設置,則只能獲得一個意圖超過一個 SMS。實際上,意圖可以包含來自不同發件人的SMS和零個或多個多部分SMS。

你可以試試這個方法:

添加SmsReceiver類與清單android.provider.Telephony.SMS_RECEIVED意圖過濾器。

onReceive方法的類將得到一個pdus包的意圖。這些pdu可以來自不同的發送者,並且/或者在多部分文本消息的情況下可以來自同一個發送者的更多的pdus,您必須將它們連接起來。

10
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) { 

} 
3

較短的解決方案:

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()); 
         } 
        } 
       }