Android – 从PDU弃用API创build短信?

我想创build一个应用程序,当SMS到达并处理该SMS时得到通知,但读取createFromPdu函数的参考,它指出:

此方法很快将被弃用,所有通过处理SMS_RECEIVED_ACTION广播意图处理传入SMS消息的应用程序现在必须将新格式String extra从意图传递到新方法createFromPdu(byte [],String),该方法需要一个额外的格式参数。 为了在需要同时支持3GPP和3GPP2格式的设备(如双模GSM / CDMA和CDMA / LTE电话)上正确解码PDU,这是必需的。

但是,文档和SDK都缺lesscreateFromPdu(byte[], String)函数。

我该怎么办? 我需要支持这些双卡双模手机。

Solutions Collecting From Web of "Android – 从PDU弃用API创build短信?"

总之,使用这个:

 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(); } 

如果你想从pdu创buildSmsMessage对象,你可以使用新的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的问题的date。

在写这篇文章的时候,我们在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中用于多SIM设备的订阅ID),并为您提供一个SmsMessage实例数组。

在Google的MMS应用程序中可以看到如何使用它的一个例子:

https://android.googlesource.com/platform/packages/apps/Mms/+/master/src/com/android/mms/transaction/SmsReceiverService.java (请参阅handleSmsReceived

从SDK_INT 23弃用createFromPdu(byte[]) ,所以你必须使用

createFromPdu((byte[]) , format);

这里是我的代码来获取传入的短信

我正在使用SMSReceiver类作为Activity SMSReceiver类。

这是我的工作代码

 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; } } 

抱歉迟到的反应,但它可以帮助无论如何。 除了检查Android版本,如果它是M以上,并提取唱歌格式。 我会build议使用:

 compile 'me.everything:providers-android:1.0.1' 

performance

 <uses-permission android:name="android.permission.READ_SMS" /> 

并在你的代码

 public List<Sms> mySmses(Context context)throws Exception{ TelephonyProvider telephonyProvider = new TelephonyProvider(context); List<Sms> smses = telephonyProvider.getSms(TelephonyProvider.Filter.INBOX).getList(); if(smses.isEmpty()){ throw new Exception("No SMS found"); } return smses; } 

请记住使用AsyncTask获取SMSes(使用上述方法),因为这是一个长时间运行的操作。 如果它在UI线程上执行,它可能会使应用程序(在某些情况下)崩溃。

这个库节省了我的时间。 希望它会对某人做同样的事情。