Android – Создать SMS из устаревшего API PDU?

Я хочу создать приложение, которое получает уведомление, когда SMS приходит и обрабатывает это SMS, но, читая ссылку для функции createFromPdu , он заявляет, что:

Этот метод скоро будет устаревшим, и все приложения, которые обрабатывают входящие SMS-сообщения, обработав намерение трансляции SMS_RECEIVED_ACTION, теперь должны передать новый формат String дополнительно из намерения в новый метод createFromPdu (byte [], String), который принимает дополнительный параметр формата. Это необходимо для того, чтобы правильно декодировать PDU на устройствах, которые требуют поддержки как 3GPP, так и 3GPP2 форматов одновременно, таких как телефоны с двумя режимами GSM / CDMA и CDMA / LTE.

Однако createFromPdu(byte[], String) отсутствует как в документации, так и в SDK.

Что мне делать? Мне нужно поддерживать эти двухмодовые телефоны с двумя SIM-картами.

Solutions Collecting From Web of "Android – Создать SMS из устаревшего API PDU?"

Короче говоря, используйте это:

 SmsMessage smsMessage; if (Build.VERSION.SDK_INT >= 19) { //KITKAT SmsMessage[] msgs = Telephony.Sms.Intents.getMessagesFromIntent(intent); smsMessage = msgs[0]; } else { Object pdus[] = (Object[]) bundle.get("pdus"); smsMessage = SmsMessage.createFromPdu((byte[]) pdus[0]); } 
  public void onReceive(Context context, Intent intent) { SmsMessage[] msgs = Telephony.Sms.Intents.getMessagesFromIntent(intent); String format = intent.getStringExtra("format"); SmsMessage sms = msgs[0]; Log.v("TAG", "handleSmsReceived" + (sms.isReplace() ? "(replace)" : "") + " messageUri: " + ", address: " + sms.getOriginatingAddress() + ", body: " + sms.getMessageBody()); String message = sms.getMessageBody(); } 

Если вы хотите создать объект SmsMessage из pdu, вы можете использовать новый api

http://developer.android.com/reference/android/telephony/SmsMessage.html#createFromPdu (byte [], java.lang.String)

  SmsMessage sms2 = SmsMessage.createFromPdu(msgs[0].getPdu(),format); 

Вы не указываете, какую версию Android вы планируете, но учитывая дату вопроса, который я предполагаю Jelly Bean 4.x.

На момент написания этого мы находимся на Lollipop MR1, и примечание об использовании createFromPdu с параметром формата все еще стоит:

https://android.googlesource.com/platform/frameworks/opt/telephony/+/android-5.1.0_r3/src/java/android/telephony/SmsMessage.java

Вместо того, чтобы использовать этот API напрямую, вы можете использовать API провайдера телефонии getMessagesFromIntent : http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.1.2_r1/android /provider/Telephony.java/#686

Этот метод рассматривает формат PDU (и идентификатор подписки в Lollipop для устройств Multi SIM) и предоставляет массив экземпляров SmsMessage.

Пример того, как он используется, можно увидеть в приложении MMS Google:

https://android.googlesource.com/platform/packages/apps/Mms/+/master/src/com/android/mms/transaction/SmsReceiverService.java (см. handleSmsReceived )

createFromPdu(byte[]) устарел из SDK_INT 23, поэтому вам нужно использовать

createFromPdu((byte[]) , format);

Вот мой код для получения входящих SMS-сообщений

Я использую класс SMSReceiver как внутренний класс Activity .

Это мой рабочий код

 public class SamplaActivity extends BaseActivity { SMSReceiver otp; @Override protected void onCreate(@Nullable Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_splash); otp=new SMSReceiver(); ........ ........ } @Override protected void onResume() { super.onResume(); // register broadcast receiver IntentFilter filter = new IntentFilter(); filter.addAction("android.provider.Telephony.SMS_RECEIVED"); registerReceiver(otp, filter); } @Override protected void onPause() { super.onPause(); unregisterReceiver(otp); } private class SMSReceiver extends BroadcastReceiver { private Bundle bundle; private SmsMessage currentSMS; private String message; @Override public void onReceive(Context context, Intent intent) { if (intent.getAction().equals("android.provider.Telephony.SMS_RECEIVED")) { bundle = intent.getExtras(); if (bundle != null) { Object[] pdu_Objects = (Object[]) bundle.get("pdus"); if (pdu_Objects != null) { for (Object aObject : pdu_Objects) { currentSMS = getIncomingMessage(aObject, bundle); String senderNo = currentSMS.getDisplayOriginatingAddress(); message = currentSMS.getDisplayMessageBody(); Toast.makeText(OtpActivity.this, "senderNum: " + senderNo + " :\n message: " + message, Toast.LENGTH_LONG).show(); } this.abortBroadcast(); // End of loop } } } // bundle null } } private SmsMessage getIncomingMessage(Object aObject, Bundle bundle) { SmsMessage currentSMS; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.M) { String format = bundle.getString("format"); currentSMS = SmsMessage.createFromPdu((byte[]) aObject, format); } else { currentSMS = SmsMessage.createFromPdu((byte[]) aObject); } return currentSMS; } }