2015-11-16 2 views
0

Я использую «устаревший код» для чтения входящих сообщений на Android. Код выглядит следующим образом:читать входящие SMS-сообщения в android

public void onReceive(Context context, Intent intent) { 
    Bundle bundle = intent.getExtras(); 

    try { 
     if (bundle != null) { 
      String smsSender =""; 
      String smsBody = ""; 
      long smsTimestamp = 0L; 
      Object[] pdu_list = (Object[]) bundle.get("pdus"); 

      for (Object pdu : pdu_list) { 
       SmsMessage msg = SmsMessage.createFromPdu((byte[])pdu); 
       if (msg == null) continue; 
       smsSender = msg.getOriginatingAddress(); 
       smsBody += msg.getMessageBody().toString(); 
       smsTimestamp = msg.getTimestampMillis(); 
      } 
      ... 

Что делать, если pdu_list имеет более одного члена? Когда он содержит два или более PDU, они ссылаются на одно и то же длинное/конкатенированное SMS или на действительно разные сообщения?

В приведенном выше коде я конкатенирую тело текстового сообщения, но я не уверен, что это правильно.

+0

Я недавно ответил, что в [этот пост] (http://stackoverflow.com/questions/33720240). –

+0

Таким образом, цикл for имеет целью объединить одно сообщение *, разделенное на несколько PDU. В этом случае, я думаю, что отправитель одинаковый для каждого PDU, поэтому не важно извлекать его из первого или последнего, правильно? – pozzugno

+0

Бинго. Ваш приемник будет получать только одно сообщение одновременно. Он может быть разделен на несколько частей, но все эти части содержат одно сообщение. –

ответ

0

Это рабочий код для получения смс текста и номера.

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

      ctx = context; 
      String str = ""; 

      Log.i(TAG, "Intent recieved: " + intent.getAction()); 

if (intent.getAction().equals(SMS_RECEIVED)) { 
       Bundle bundle = intent.getExtras(); 
       System.out.println(" ---Recieved1 "); 
       if (bundle != null) { 
        System.out.println(" ---Recieved2 "); 
        Object[] pdus = (Object[]) bundle.get("pdus"); 
        final SmsMessage[] messages = new SmsMessage[pdus.length]; 
        for (int i = 0; i < pdus.length; i++) { 
         System.out.println("Message"); 
         messages[i] = SmsMessage.createFromPdu((byte[]) pdus[i]); 
         str += "SMS from " 
           + messages[i].getOriginatingAddress().replaceAll(
             "[^a-zA-Z0-9 ]", ""); 
         str += " is "; 
         str += messages[i].getMessageBody().toString(); 
         str += ""; 
        } 

       }}} 
+1

Недостаточно ясности, если цикл for имеет цель объединить одно сообщение *, разделенное на несколько PDU, или обрабатывать * разные * сообщения, по одному на PDU. Кроме того, str + = "" бесполезно. Возможно, это str + = "\ n", и в этом случае кажется, что цикл for генерирует * разные * сообщения, по одному на PDU. – pozzugno

Смежные вопросы