특정 SMS를 수신해야하는 애플리케이션이 있습니다. 지금까지 쉬운.Android - 긴 SMS 수신 (멀티 파트)
그러나 메시지를 받으면 멀티 파트입니다. SMS를 하나의 메시지로 받아들이는 적절한 방법이 있습니까?
이제 내 활동이 SMS의 각 부분에 대해 두 번 시작됩니다. 손으로 SMS를 연결해야합니까?
특정 SMS를 수신해야하는 애플리케이션이 있습니다. 지금까지 쉬운.Android - 긴 SMS 수신 (멀티 파트)
그러나 메시지를 받으면 멀티 파트입니다. SMS를 하나의 메시지로 받아들이는 적절한 방법이 있습니까?
이제 내 활동이 SMS의 각 부분에 대해 두 번 시작됩니다. 손으로 SMS를 연결해야합니까?
멀티 파트 메시지를 올바르게 처리하는 것으로 보이는 것처럼 들어오는 SMS를 처리하는 방법을 확인하는 것이 유용 할 수 있습니다.
링크를 제공해 주셔서 감사합니다. 정말 도움이되었습니다. 링크의 RetrieveMessages 메소드는 하나의 멀티 파트 메시지를 모두 수집하는 데 도움이되었습니다. –
링크가 죽었다는 수치 스 – Armand
@Armand : 링크가 업데이트되었습니다. –
예 SMS를 직접 연결해야하지만 분명히 각 메시지 세그먼트에 대해 새 활동을 시작하고 싶지는 않습니다.
활동의 속성을 singleTask
또는 singleInstance
으로 설정하는 것이 좋습니다.
SMS를 Service
으로 수신하도록 설정하면 전체 메시지가있는 경우에만 Activity
을 새로 시작합니다.
한 번 multipart 메시지를 수신하는 방법을 모르고 있습니다. 그러나 올바른 의도 필터 설정이있는 경우에만 인 텐트는 하나 이상 SMS. 실제로 의도에는 다른 발신자의 SMS 및/또는 0 개 이상의 다중 문자 SMS가 포함될 수 있습니다.
가 매니페스트에 android.provider.Telephony.SMS_RECEIVED 의도 필터와 함께 SmsReceiver 클래스를 추가 :이 방법을 시도 할 수
.
onReceive Method 클래스는 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과 함께 한 번 트리거되고 part2와 함께 다시 트리거 될 수 있습니까? –
여러 수신자의 경우 : onReceive() 메소드를 한 번 호출하면 여러 소스의 메시지를 포함 할 수 있습니까? –
위의 코드는 holes로 가득합니다. 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