我想创建一个应用程序,当SMS到达并处理该SMS时会收到通知,但是在阅读createFromPdu函数的参考时,它会声明:
这个方法很快就会被弃用,所有通过处理SMS_RECEIVED_ACTION广播意图来处理传入SMS消息的应用程序现在必须将新格式String extra从intent传递给新方法createFromPdu(byte [],String),这需要额外的格式参数。这是为了在需要同时支持3GPP和3GPP2格式的设备上正确解码PDU所必需的,例如双模GSM / CDMA和CDMA / LTE电话。
但是文档和SDK都缺少createFromPdu(byte[], String)
函数。
我该怎么办?我需要支持这些双卡双待手机。
答案 0 :(得分:26)
简而言之,请使用:
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]);
}
答案 1 :(得分:5)
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创建SmsMessage对象,可以使用新的api
SmsMessage sms2 = SmsMessage.createFromPdu(msgs[0].getPdu(),format);
答案 2 :(得分:2)
你没有提到你所针对的Android版本,但是考虑到我假设Jelly Bean 4.x的问题日期。
在撰写本文时,我们在Lollipop MR1上,关于使用带格式参数的createFromPdu的弃用说明仍然有效:
不是直接使用该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的彩信应用中可以看到如何使用它的示例:
https://android.googlesource.com/platform/packages/apps/Mms/+/master/src/com/android/mms/transaction/SmsReceiverService.java(请参阅handleSmsReceived
)
答案 3 :(得分:2)
createFromPdu(byte[])
,因此您必须使用
createFromPdu((byte[]) , format);
这是我收到短信的代码
我使用
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;
}
}
答案 4 :(得分:0)
compile 'me.everything:providers-android:1.0.1'
清单
<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来获取SMS(使用上述方法),因为这是一个长时间运行的操作。如果它在UI线程上执行,它可能会使您的应用程序崩溃(在某些情况下)。
这个图书馆节省了我的时间。希望它会对某人做同样的事情。