日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

WAP PUSH解析(3)——Android中实现

發布時間:2023/12/10 Android 44 豆豆
生活随笔 收集整理的這篇文章主要介紹了 WAP PUSH解析(3)——Android中实现 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

Android中已經實現了SMS PDU的解析、WSP的解析,得到了WBXML封裝的數據,并發出了廣播"android.provider.Telephony.WAP_PUSH_RECEIVED"。原生實現中還沒有對mimeType類型為WAP PUSH SI 和WAP PUSH SL 的該廣播的響應,亦即,缺少對WBXML封裝的PUSH數據的處理。本文通過分析總結Android中的原生實現,給出WAP PUSH SI/SL的實現參考。

?

一、Android中的原生實現

筆者已經有幾篇文章分別描述SMS的接收處理過程,SMS PDU / WSP / WBXML的封裝格式。

?《Android中的SMS接收處理》側重于SMS接收處理過程的描述;
?《WAP PUSH解析(1)——SMS PDU編碼》側重于描述PDU的封裝格式;
?《WAP PUSH解析(2)——WSP以及WBXML編碼》描述WSP和WBXML的封裝。
?

這里總結一下:

RIL中收到new SMS,調用android.telephony.SmsMessage.newFromCMT() decode PDU,結果放入SmsMessage中。android.telephony.SmsMessage.newFromCMT() 根據電話的類型,用com.android.internal.telephony.gsm.SmsMessage或com.android.internal.telephony.cdma.SmsMessage的newFromCMT()真正的實現PDU decode;
執行SmsDispatcher (具體實現類GsmSmsDispatcher /CdmaSmsDispatcher)的dispatchMessage()分發消息msg。有目標端口且目標端口是WAP PUSH(SmsHeader.PORT_WAP_PUSH)的信息,用WapPushOverSms::dispatchWapPdu()來處理;
WapPushOverSms::dispatchWapPdu()中解析WSP,得到對應ContentType的MIME Type:Service Indication (SI)為"application/vnd.wap.sic";Service Load (SL)為"application/vnd.wap.slc"。對SI和SL類型,調用dispatchWapPdu_default()。
下面是dispatchWapPdu_default()的實現:

? ? private void dispatchWapPdu_default(byte[]pdu, int transactionId, int pduType,
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? StringmimeType, int headerStartIndex, int headerLength) {
? ? ? ? byte[] header = new byte[headerLength];
? ? ? ? System.arraycopy(pdu, headerStartIndex,header, 0, header.length);
? ? ? ? int dataIndex = headerStartIndex +headerLength;
? ? ? ? byte[] data;
?
? ? ? ? data = new byte[pdu.length -dataIndex];
? ? ? ? System.arraycopy(pdu, dataIndex, data,0, data.length);
?
? ? ? ? Intent intent = newIntent(Intents.WAP_PUSH_RECEIVED_ACTION);
? ? ? ? intent.setType(mimeType);
? ? ? ? intent.putExtra("transactionId", transactionId);
? ? ? ? intent.putExtra("pduType",pduType);
? ? ? ? intent.putExtra("header",header);
? ? ? ? intent.putExtra("data",data);
?
? ? ? ? mSmsDispatcher.dispatch(intent,"android.permission.RECEIVE_WAP_PUSH");
? ? }


????????以上都是在Framework中處理的,可以看到Framework中已經解析出了SI/SL的WBXML封裝的數據,并通過Broadcast廣播出去了。接下來,對mimeType標識的具體業務的處理,是application層的工作。而對mimeType為"application/vnd.wap.sic"(SI)和"application/vnd.wap.slc"(SL)的WAP_PUSH_RECEIVED的處理,Android的原生實現中沒有實現。

????????關注一下發出廣播的Intent參數:

?mimeType: “application/vnd.wap.sic"或 application/vnd.wap.slc";
?header: WSP解析出來的header,用來識別ContentType的,已經有了mimeType,這個已經沒什么意義;
?data: WBXML封裝的SI或SL XML數據。
?

要實現完整的WAP PUSH,只要:

?實現mimeType為"application/vnd.wap.sic"(SI)和"application/vnd.wap.slc"(SL)的WAP_PUSH_RECEIVED的處理;
?收到的廣播中實現對WBXML封裝的SI/SL解析,并插入消息庫。
可參考MMS中對"application/vnd.wap.mms-message"(MMS)類型的WAP_PUSH_RECEIVED處理的實現。

?
二、處理"android.provider.Telephony.WAP_PUSH_RECEIVED"

?

要處理"android.provider.Telephony.WAP_PUSH_RECEIVED",定義BroardcastReceiver實現類WapPushReceiver,并在AndroidManifest.xml中加入對"application/vnd.wap.sic"(SI)和"application/vnd.wap.slc"(SL)類型的WAP_PUSH_RECEIVED處理的聲明。

? ? ? ? <receiver android:name=".transaction.WapPushReceiver"
? ? ? ? ? ?android:permission="android.permission.BROADCAST_WAP_PUSH">
? ? ? ? ? ?<intent-filter>
? ? ? ? ? ? ? ? <action android:name="android.provider.Telephony.WAP_PUSH_RECEIVED" />
? ? ? ? ? ? ? ? <data android:mimeType="application/vnd.wap.sic" />
? ? ? ? ? ? ? ? <data android:mimeType="application/vnd.wap.slc" />
? ? ? ? ? ?</intent-filter>
? ? ? ? </receiver>

三、WapPushReceiver中對WBXML解析

可參考原生實現中MMS中PushReceiver的處理,做如下實現:

WapPushReceiver的onReceive()通過Intent的“data“參數,獲取WBXML封裝的PushData;
啟動一個AsyncTask在后臺解析WBXML封裝的PushData,解析出PushData (XML格式);
解析XML格式的PushData,得到URL/Content/Signal等信息;
根據3的結果,選擇加入Message數據庫,并通知用戶。
這里面關鍵點是WBXML格式的解析,可以參考?MIUI ROM接收WAP PUSH短信的補丁。這是為小米手機做的WAP PUSH解析實現,里面有WBXML解析的源代碼可參考。不過這里面對WBXML中定義的TAG和Attribute的支持不全,讀者可根據自己需求加入所需要的支持。

?

參考資料

1.?Google Android source2.3.7_r1

????????Android原生實現源代碼

2.?WAP Binary XMLContent Format

????????WBXML標準,必看!

3.?MIUI ROM接收WAP PUSH短信的補丁

????????Android上的WAPPUSH解析實現,有源代碼,但是解析不全。

4.?WAP Push over SMS

????????WAP PUSH over SMS的大致介紹(英文)

5.?WAP Push SMS encoding

????????WAP PUSH Service Indication封裝實例(英文)

6.?Sending SMS WAPPush messages using the ActiveXperts SMSand MMS Toolkit

????發送WAP PUSH的工具。是使用說明,雖然沒實現細節,但可參考WBXML的Token和Attribute對照。(英文)

?
?

總結

以上是生活随笔為你收集整理的WAP PUSH解析(3)——Android中实现的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。