Android接收短信-createFromPdu
createFromPdu(byte[]) method was deprecated in API level 23. Use createFromPdu(byte[], String) instead.
Android收到短信的事件是由系統發一個有序廣播的,所以這里需要一個BroadcastReceiver。receiver收到的Intent里面并不是直接存儲的短信內容,而是短信的原始數據。所以我們需要自己解碼。
獲取短信的原始數據
獲取短信的原始數據: 原始數據被叫做PDU,一個PDU就是一個數據段,如果短信比較長的話可能是由幾個PDU組成的。
@Override public void onReceive(Context context, Intent intent) {Bundle smsBundle = intent.getExtras();if (smsBundle != null) {Object[] pdus = (Object[]) smsBundle.get("pdus");} }上面的smsBundle.get("pdus")返回的實際類型是byte[][],二維數組的每一個子數組就是一個pdu。
解碼短信內容
解碼短信內容: 這里主要使用到的是SmsMessage.createFromPdu方法。
private String parseMessageFromRawData(Object[] pdus) {if (pdus == null) return null;try {StringBuilder message = new StringBuilder();for (Object pdu : pdus) {SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdu);if (smsMessage == null) continue;message.append(smsMessage.getDisplayMessageBody());}return message.toString();} catch (Exception e) {Log.e(TAG, "SMSBroadcastReceiver read sms failed", e);} catch (OutOfMemoryError oom) {Log.e(TAG, "SMSBroadcastReceiver caused OOM =_=!", oom);//為了避免后續操作出現問題,gc一下System.gc();System.gc();}return null; }上面的重點就是SmsMessage smsMessage = SmsMessage.createFromPdu((byte[]) pdu);這一句了。需要注意的是這個操作容易導致OOM(已經有好多Crash上報了。。。),所以要特別處理一下。
另外: 上面的SmsMessage.createFromPdu方法已經被官方文檔說明即將被廢棄(deprecated)原因是為了同時支持3GPP和3GPP2,他們是移動系統通信標準的擬定組織分別擬定了GSM/UMTS/LTE標準和CDMA/LTE標準。因此推薦是用的方法是createFromPdu(byte[] pdu, String format)其中fotmat可以是SmsConstants.FORMAT_3GPP或者SmsConstants.FORMAT_3GPP2。
出于好奇我看了一眼SmsMessage.createFromPdu的代碼實現,發現他本身就做了制式判斷的(=_=!),代碼寫的還是不錯的,粘出來。萬一以后這個方法被廢棄了,還有個參考。
public static SmsMessage createFromPdu(byte[] pdu) {SmsMessage message = null;// cdma(3gpp2) vs gsm(3gpp) format info was not given,// guess from active voice phone typeint activePhone = TelephonyManager.getDefault().getCurrentPhoneType();String format = (PHONE_TYPE_CDMA == activePhone) ?SmsConstants.FORMAT_3GPP2 : SmsConstants.FORMAT_3GPP;message = createFromPdu(pdu, format);if (null == message || null == message.mWrappedSmsMessage) {// decoding pdu failed based on activePhone type, must be other formatformat = (PHONE_TYPE_CDMA == activePhone) ?SmsConstants.FORMAT_3GPP : SmsConstants.FORMAT_3GPP2;message = createFromPdu(pdu, format);}return message; }總結
以上是生活随笔為你收集整理的Android接收短信-createFromPdu的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 跨进程访问(AIDL服务)
- 下一篇: ANR的三种类型