2010-11-29 6 views
22

특정 SMS를 수신해야하는 애플리케이션이 있습니다. 지금까지 쉬운.Android - 긴 SMS 수신 (멀티 파트)

그러나 메시지를 받으면 멀티 파트입니다. SMS를 하나의 메시지로 받아들이는 적절한 방법이 있습니까?

이제 내 활동이 SMS의 각 부분에 대해 두 번 시작됩니다. 손으로 SMS를 연결해야합니까?

+0

이것은 바보 같은 질문처럼 보일 수 있지만 160 자 이하로 메시지를 듣고 단축하는 방법이 있나요? – Phobos

+1

nope;) 나를 보내지 마십시오. – Danail

답변

20

멀티 파트 메시지를 올바르게 처리하는 것으로 보이는 것처럼 들어오는 SMS를 처리하는 방법을 확인하는 것이 유용 할 수 있습니다.

+2

링크를 제공해 주셔서 감사합니다. 정말 도움이되었습니다. 링크의 RetrieveMessages 메소드는 하나의 멀티 파트 메시지를 모두 수집하는 데 도움이되었습니다. –

+0

링크가 죽었다는 수치 스 – Armand

+0

@Armand : 링크가 업데이트되었습니다. –

1

예 SMS를 직접 연결해야하지만 분명히 각 메시지 세그먼트에 대해 새 활동을 시작하고 싶지는 않습니다.

활동의 속성을 singleTask 또는 singleInstance으로 설정하는 것이 좋습니다.

SMS를 Service으로 수신하도록 설정하면 전체 메시지가있는 경우에만 Activity을 새로 시작합니다.

1

한 번 multipart 메시지를 수신하는 방법을 모르고 있습니다. 그러나 올바른 의도 필터 설정이있는 경우에만 인 텐트는 하나 이상 SMS. 실제로 의도에는 다른 발신자의 SMS 및/또는 0 개 이상의 다중 문자 SMS가 포함될 수 있습니다.

가 매니페스트에 android.provider.Telephony.SMS_RECEIVED 의도 필터와 함께 SmsReceiver 클래스를 추가 :이 방법을 시도 할 수

.

onReceive Method 클래스는 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과 함께 한 번 트리거되고 part2와 함께 다시 트리거 될 수 있습니까? –

+3

여러 수신자의 경우 : onReceive() 메소드를 한 번 호출하면 여러 소스의 메시지를 포함 할 수 있습니까? –

+0

위의 코드는 holes로 가득합니다. 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()); 
         } 
        } 
       } 
관련 문제