2010-11-29 9 views
22

私は特定のSMSを聞く必要があるアプリケーションを持っています。これまでのところ簡単です。Android - 長いSMS(マルチパート)を受信

しかし、私がメッセージを受け取ったら、それはマルチパートです。 SMSを1つのメッセージとして受信する適切な方法はありますか?

今、私の活動はSMSの各部分について2回始まります。手作業でSMSを連結する必要がありますか?

+0

これは愚かな質問のように見えるかもしれませんが、160文字以下にメッセージのために耳を傾けを短縮する方法はありますか? – Phobos

+1

nope;)私には送信されません。 – Danail

答えて

20

マルチパートメッセージを正しく処理するように見えるので、受信SMSをどのように処理するかを調べると便利です。

+2

リンクをありがとう、本当に役に立ちました。リンク内のRetrieveMessagesメソッドは、すべてのマルチパートメッセージを1つに集めるのに役立ちました。 –

+0

リンクが死んでいるという恥です – Armand

+0

@Armand:リンクが更新されました。 –

1

はい、SMSを手作業で連結する必要がありますが、各メッセージセグメントに対して新しいアクティビティを開始したくないことは明らかです。

私はそれが起こらないようにsingleTaskまたはsingleInstanceにあなたの活動のlaunchMode属性を設定することをお勧めします。

また、Serviceで受信したSMSは、完全なメッセージを受け取ったばかりの新しいActivityに送信されます。

1

私はマルチパートメッセージを一度に受信する方法を知らない。しかし、正しいインテントフィルターの設定がある場合は、1つだけインテント以上1つ SMSを取得します。実際、インテントには、異なる送信者のSMS および/またはのゼロ件以上のマルチパートSMSを含めることができます。

あなたはこのアプローチを試みることができる:

はマニフェストにandroid.provider.Telephony.SMS_RECEIVED意図フィルターでSmsReceiverクラスを追加します。

クラス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

ありがとう、私のために働く。どのような考えが実際にどのようにうまくいくのか?たとえば、PDUが実際のネットワークで間違った順序で来ることはありますか?あるいは、レシーバーをpart1で1回、part2でもう一度トリガーすることができますか? –

+3

複数の送信者について:複数の送信元からのメッセージを含むonReceive()メソッドへの1回の呼び出しは可能でしょうか? –

+0

上記のコードは穴がいっぱいです.GSM仕様では、PDUが順番に配送されると仮定しないでください。また、GSMメッセージのスループットは約6〜10 /分です。オペレータはそれ以上のマルチパートを持っている(または複数のメッセージを一度に受信しています)ので、後で再試行します。 – Lieuwe

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()); 
         } 
        } 
       } 
関連する問題