私は特定のSMSを聞く必要があるアプリケーションを持っています。これまでのところ簡単です。Android - 長いSMS(マルチパート)を受信
しかし、私がメッセージを受け取ったら、それはマルチパートです。 SMSを1つのメッセージとして受信する適切な方法はありますか?
今、私の活動はSMSの各部分について2回始まります。手作業でSMSを連結する必要がありますか?
私は特定のSMSを聞く必要があるアプリケーションを持っています。これまでのところ簡単です。Android - 長いSMS(マルチパート)を受信
しかし、私がメッセージを受け取ったら、それはマルチパートです。 SMSを1つのメッセージとして受信する適切な方法はありますか?
今、私の活動はSMSの各部分について2回始まります。手作業でSMSを連結する必要がありますか?
マルチパートメッセージを正しく処理するように見えるので、受信SMSをどのように処理するかを調べると便利です。
リンクをありがとう、本当に役に立ちました。リンク内のRetrieveMessagesメソッドは、すべてのマルチパートメッセージを1つに集めるのに役立ちました。 –
リンクが死んでいるという恥です – Armand
@Armand:リンクが更新されました。 –
はい、SMSを手作業で連結する必要がありますが、各メッセージセグメントに対して新しいアクティビティを開始したくないことは明らかです。
私はそれが起こらないようにsingleTask
またはsingleInstance
にあなたの活動のlaunchMode
属性を設定することをお勧めします。
また、Service
で受信したSMSは、完全なメッセージを受け取ったばかりの新しいActivity
に送信されます。
私はマルチパートメッセージを一度に受信する方法を知らない。しかし、正しいインテントフィルターの設定がある場合は、1つだけインテント以上1つ SMSを取得します。実際、インテントには、異なる送信者のSMS および/またはのゼロ件以上のマルチパートSMSを含めることができます。
あなたはこのアプローチを試みることができる:
はマニフェストにandroid.provider.Telephony.SMS_RECEIVED意図フィルターでSmsReceiverクラスを追加します。
クラス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) {
}
ありがとう、私のために働く。どのような考えが実際にどのようにうまくいくのか?たとえば、PDUが実際のネットワークで間違った順序で来ることはありますか?あるいは、レシーバーをpart1で1回、part2でもう一度トリガーすることができますか? –
複数の送信者について:複数の送信元からのメッセージを含むonReceive()メソッドへの1回の呼び出しは可能でしょうか? –
上記のコードは穴がいっぱいです.GSM仕様では、PDUが順番に配送されると仮定しないでください。また、GSMメッセージのスループットは約6〜10 /分です。オペレータはそれ以上のマルチパートを持っている(または複数のメッセージを一度に受信しています)ので、後で再試行します。 – Lieuwe
短いソリューション:
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
nope;)私には送信されません。 – Danail