Android - 从PDU弃用的API创建SMS?

zac*_*sek 26 sms android deprecated android-6.0-marshmallow

我想创建一个应用程序,当SMS到达并处理该SMS时收到通知,但是读取createFromPdu函数的引用,它声明:

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

但是createFromPdu(byte[], String)文档和SDK都缺少该功能.

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

Era*_*sav 27

简而言之,使用这个:

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]);          
}
Run Code Online (Sandbox Code Playgroud)

  • 有些设备在bundle.get("pdus")下的else条件下给我classcastexception (2认同)

Anh*_*arp 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();
}
Run Code Online (Sandbox Code Playgroud)

如果要从pdu创建SmsMessage对象,可以使用新的api

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

  SmsMessage sms2 = SmsMessage.createFromPdu(msgs[0].getPdu(),format);
Run Code Online (Sandbox Code Playgroud)


fej*_*ejd 2

您没有提及您的目标 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 getMessagesFromIntenthttp://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/4.1.2_r1/android/提供商/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