Android中的Serializable、Parcelable">Android中的Serializable、Parcelable
777
2022-05-30
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"); } }
1
2
3
4
5
6
7
8
上面的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; }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
上面的重點就是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 type int 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 format format = (PHONE_TYPE_CDMA == activePhone) ? SmsConstants.FORMAT_3GPP : SmsConstants.FORMAT_3GPP2; message = createFromPdu(pdu, format); } return message; }
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Android
版權聲明:本文內容由網絡用戶投稿,版權歸原作者所有,本站不擁有其著作權,亦不承擔相應法律責任。如果您發現本站中有涉嫌抄襲或描述失實的內容,請聯系我們jiasou666@gmail.com 處理,核實后本網站將在24小時內刪除侵權內容。