2015-11-15 73 views
4

我正在閱讀我的應用程序中的短信。每當短信到達它來到應用程序,並顯示。非英文短信顯示爲多個字符串?

它正在爲英語工作,但當用古吉拉特語語言時,它們被分解成多個字符串。

這裏是我的代碼:

final Object[] pdusObj = (Object[]) bundle.get("pdus"); 
       msgs = new SmsMessage[pdusObj.length]; 
       for (int i=0; i<msgs.length; i++) { 
        msgs[i] = SmsMessage.createFromPdu((byte[])pdusObj[i]); 
        smsReceiveTime = msgs[i].getTimestampMillis(); 
        str += "SMS from " + msgs[i].getDisplayOriginatingAddress(); 
        str += " :"; 
        str += msgs[i].getDisplayMessageBody().toString(); 
        str += "\n"; 
       } 
+0

我正在閱讀使用廣播接收器的應用程序中的短信,每當有新短信到達時,它都會顯示在我的應用程序中。它適用於英文短信,但當短信以古吉拉特語出現時,短信已被打破 –

+0

「msgs」中的每個「SmsMessage」都不是一個不同的文本。它們是單個文本消息的一部分。在'for'循環中,連接'getDisplayMessageBody()'字符串以獲得完整的單個消息。將剩餘的東西移出循環。 –

+0

感謝您的幫助,但如果我將其他東西從循環中移出,那麼我將如何訪問消息[i] !!!!你能否通過在代碼中提供相同的答案來幫助我。 –

回答

2

...但是當古吉拉特被分成了多個字符串

當短信超過了最大消息長度(這取決於使用的字符集),它可以分解爲多個部分,並作爲多部分消息發送。您的情況就是這樣,以及您構建代碼的方式,看起來好像您正在接收幾個不同的文本。

當您收到一個多部分信息時,您將在onReceive()中以多個SmsMessage結尾。這些不是單獨的消息,而是單個消息的部分。各個機構必須連接起來組合一個完整的信息。

以下是如何檢索收到的郵件,任意數量的零件以及發件人號碼和郵件時間戳的簡單示例。

@Override 
public void onReceive(Context context, Intent intent) { 

    String number = "unknown"; 
    StringBuilder message = new StringBuilder(); 
    long timestamp = 0; 

    if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) { 
     SmsMessage[] msgs = Telephony.Sms.Intents.getMessagesFromIntent(intent); 

     number = msgs[0].getDisplayOriginatingAddress(); 
     timestamp = msgs[0].getTimestampMillis(); 

     for (int i = 0; i < msgs.length; i++) { 
      message.append(msgs[i].getDisplayMessageBody()); 
     } 
    } 
    else { 
     Object[] pdus = (Object[]) intent.getSerializableExtra("pdus"); 
     for (int i = 0; i < pdus.length; i++) { 
      byte[] pdu = (byte[]) pdus[i]; 
      SmsMessage msg = SmsMessage.createFromPdu(pdu); 

      if (i == 0) { 
       number = msg.getDisplayOriginatingAddress(); 
       timestamp = msg.getTimestampMillis(); 
      } 

      message.append(msg.getDisplayMessageBody()); 
     } 
    } 

    String report = String.format("SMS from %s%nMessage : %s%nSent : %s", 
            number, 
            message.toString(), 
            DateFormat.getDateTimeInstance() 
              .format(new Date(timestamp))); 

    ... 
} 

與奇巧開始,Telephony.Sms.Intents.getMessagesFromIntent()方法可用來處理Intent額外包含消息。它返回一個SmsMessage的數組,我們只需循環並提取必要的數據即可。

在KitKat之前,該方法並未公開,所以我們需要自己處理處理。如果您不支持KitKat之前的版本,則可以削減上述示例以刪除特定於這些早期版本的代碼。

+1

非常感謝你親愛的.... :) –