Android接收短信-createFromPdu

      網友投稿 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

      Android接收短信-createFromPdu

      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小時內刪除侵權內容。

      上一篇:Java基礎 第三節 第三課
      下一篇:C++搭建集群聊天室(四):工程統帥神器 Cmake,我愛死它了
      相關文章
      亚洲成a人无码亚洲成av无码| 亚洲成a人片在线看| 色欲aⅴ亚洲情无码AV| 亚洲一区二区三区四区视频| 亚洲网址在线观看你懂的| 亚洲AV永久青草无码精品| 亚洲国产成人片在线观看无码| 亚洲午夜福利717| 亚洲香蕉成人AV网站在线观看| 在线a亚洲v天堂网2019无码| 国产综合亚洲专区在线| 中国亚洲女人69内射少妇| 日韩一卡2卡3卡4卡新区亚洲| 亚洲高清免费视频| 久久精品国产亚洲Aⅴ蜜臀色欲| 亚洲国模精品一区| 国产亚洲一区二区三区在线不卡 | 亚洲免费观看网站| 亚洲免费二区三区| 亚洲人xxx日本人18| 久久亚洲国产成人影院| 亚洲欧美熟妇综合久久久久| 日本亚洲高清乱码中文在线观看| 亚洲AV中文无码乱人伦在线视色| 亚洲精品无码久久毛片| 亚洲午夜久久久久久久久久| 亚洲av无码国产精品色午夜字幕| 亚洲2022国产成人精品无码区 | 亚洲aⅴ无码专区在线观看| 国产精品亚洲精品爽爽| 亚洲国产一区明星换脸| 亚洲精品无码mv在线观看网站| 亚洲av永久无码精品秋霞电影影院| 亚洲AV成人片色在线观看高潮| 久久亚洲日韩看片无码| 中文字幕亚洲男人的天堂网络| 亚洲人成自拍网站在线观看| 亚洲国产成人精品91久久久| 亚洲中文字幕无码一区| 亚洲国产精品一区| 亚洲精品国产精品国自产网站 |