Android - получение длинных смс (multipart)
У меня есть приложение, которое должно прослушивать конкретные SMS. Пока все просто.
Но когда я получаю сообщение, оно состоит из нескольких частей. Есть ли правильный способ получить SMS как одно сообщение?
Теперь моя активность начинается два раза, для каждой части смс. Должен ли я соединить SMS вручную?
6 ответов
Может быть полезно взглянуть на то, как gTalkSMS обрабатывает входящие SMS, так как он выглядит для правильной обработки составных сообщений.
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());
}
}
}
Я не знаю, как получить многокомпонентное сообщение как один раз. Но если у вас есть правильная настройка фильтра намерений, вы получаете только одно намерение для более чем одного SMS. Фактически, Намерение может содержать SMS от разных отправителей и / или ноль или более составных SMS.
Вы можете попробовать этот подход:
Добавьте класс SmsReceiver с фильтром намерений android.provider.Telephony.SMS_RECEIVED в манифесте.
Классы onReceive Method получат намерение с помощью пакета pdus. Эти pdu могут исходить от разных отправителей каждый и / или может быть больше pdus от одного отправителя в случае составного текстового сообщения, которое вы должны объединить.
Да, вы должны объединить SMS вручную, но очевидно, что вы не хотите запускать новую активность для каждого сегмента сообщения.
Я предлагаю настроить вашу активность launchMode
приписывать singleTask
или же singleInstance
так что этого не произойдет.
Кроме того, ваши SMS-сообщения получены Service
, который запустит новый Activity
только когда у него есть полное сообщение.
С этой проблемой я столкнулся 12 лет спустя. Вы можете справиться с этим в методе onReceive SMS BroadcastReceiver. Строка fullMessage будет содержать исходное текстовое сообщение.
override fun onReceive(context: Context?, intent: Intent?) {
if (intent?.action == Telephony.Sms.Intents.SMS_RECEIVED_ACTION) {
var fullMessage = ""
var originatingAddress = ""
val smsMessages = Telephony.Sms.Intents.getMessagesFromIntent(intent)
for (message in smsMessages) {
originatingAddress = message.originatingAddress ?: ""
fullMessage += message.messageBody
}
}
}