WAP PUSH解析(3)——Android中实现
Android中已經(jīng)實(shí)現(xiàn)了SMS PDU的解析、WSP的解析,得到了WBXML封裝的數(shù)據(jù),并發(fā)出了廣播"android.provider.Telephony.WAP_PUSH_RECEIVED"。原生實(shí)現(xiàn)中還沒(méi)有對(duì)mimeType類型為WAP PUSH SI 和WAP PUSH SL 的該廣播的響應(yīng),亦即,缺少對(duì)WBXML封裝的PUSH數(shù)據(jù)的處理。本文通過(guò)分析總結(jié)Android中的原生實(shí)現(xiàn),給出WAP PUSH SI/SL的實(shí)現(xiàn)參考。
?
一、Android中的原生實(shí)現(xiàn)
筆者已經(jīng)有幾篇文章分別描述SMS的接收處理過(guò)程,SMS PDU / WSP / WBXML的封裝格式。
?《Android中的SMS接收處理》側(cè)重于SMS接收處理過(guò)程的描述;
?《WAP PUSH解析(1)——SMS PDU編碼》側(cè)重于描述PDU的封裝格式;
?《WAP PUSH解析(2)——WSP以及WBXML編碼》描述WSP和WBXML的封裝。
?
這里總結(jié)一下:
RIL中收到new SMS,調(diào)用android.telephony.SmsMessage.newFromCMT() decode PDU,結(jié)果放入SmsMessage中。android.telephony.SmsMessage.newFromCMT() 根據(jù)電話的類型,用com.android.internal.telephony.gsm.SmsMessage或com.android.internal.telephony.cdma.SmsMessage的newFromCMT()真正的實(shí)現(xiàn)PDU decode;
執(zhí)行SmsDispatcher (具體實(shí)現(xiàn)類GsmSmsDispatcher /CdmaSmsDispatcher)的dispatchMessage()分發(fā)消息msg。有目標(biāo)端口且目標(biāo)端口是WAP PUSH(SmsHeader.PORT_WAP_PUSH)的信息,用WapPushOverSms::dispatchWapPdu()來(lái)處理;
WapPushOverSms::dispatchWapPdu()中解析WSP,得到對(duì)應(yīng)ContentType的MIME Type:Service Indication (SI)為"application/vnd.wap.sic";Service Load (SL)為"application/vnd.wap.slc"。對(duì)SI和SL類型,調(diào)用dispatchWapPdu_default()。
下面是dispatchWapPdu_default()的實(shí)現(xiàn):
? ? 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中已經(jīng)解析出了SI/SL的WBXML封裝的數(shù)據(jù),并通過(guò)Broadcast廣播出去了。接下來(lái),對(duì)mimeType標(biāo)識(shí)的具體業(yè)務(wù)的處理,是application層的工作。而對(duì)mimeType為"application/vnd.wap.sic"(SI)和"application/vnd.wap.slc"(SL)的WAP_PUSH_RECEIVED的處理,Android的原生實(shí)現(xiàn)中沒(méi)有實(shí)現(xiàn)。
????????關(guān)注一下發(fā)出廣播的Intent參數(shù):
?mimeType: “application/vnd.wap.sic"或 application/vnd.wap.slc";
?header: WSP解析出來(lái)的header,用來(lái)識(shí)別ContentType的,已經(jīng)有了mimeType,這個(gè)已經(jīng)沒(méi)什么意義;
?data: WBXML封裝的SI或SL XML數(shù)據(jù)。
?
要實(shí)現(xiàn)完整的WAP PUSH,只要:
?實(shí)現(xiàn)mimeType為"application/vnd.wap.sic"(SI)和"application/vnd.wap.slc"(SL)的WAP_PUSH_RECEIVED的處理;
?收到的廣播中實(shí)現(xiàn)對(duì)WBXML封裝的SI/SL解析,并插入消息庫(kù)。
可參考MMS中對(duì)"application/vnd.wap.mms-message"(MMS)類型的WAP_PUSH_RECEIVED處理的實(shí)現(xiàn)。
?
二、處理"android.provider.Telephony.WAP_PUSH_RECEIVED"
?
要處理"android.provider.Telephony.WAP_PUSH_RECEIVED",定義BroardcastReceiver實(shí)現(xiàn)類WapPushReceiver,并在AndroidManifest.xml中加入對(duì)"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中對(duì)WBXML解析
可參考原生實(shí)現(xiàn)中MMS中PushReceiver的處理,做如下實(shí)現(xiàn):
WapPushReceiver的onReceive()通過(guò)Intent的“data“參數(shù),獲取WBXML封裝的PushData;
啟動(dòng)一個(gè)AsyncTask在后臺(tái)解析WBXML封裝的PushData,解析出PushData (XML格式);
解析XML格式的PushData,得到URL/Content/Signal等信息;
根據(jù)3的結(jié)果,選擇加入Message數(shù)據(jù)庫(kù),并通知用戶。
這里面關(guān)鍵點(diǎn)是WBXML格式的解析,可以參考?MIUI ROM接收WAP PUSH短信的補(bǔ)丁。這是為小米手機(jī)做的WAP PUSH解析實(shí)現(xiàn),里面有WBXML解析的源代碼可參考。不過(guò)這里面對(duì)WBXML中定義的TAG和Attribute的支持不全,讀者可根據(jù)自己需求加入所需要的支持。
?
參考資料
1.?Google Android source2.3.7_r1
????????Android原生實(shí)現(xiàn)源代碼
2.?WAP Binary XMLContent Format
????????WBXML標(biāo)準(zhǔn),必看!
3.?MIUI ROM接收WAP PUSH短信的補(bǔ)丁
????????Android上的WAPPUSH解析實(shí)現(xiàn),有源代碼,但是解析不全。
4.?WAP Push over SMS
????????WAP PUSH over SMS的大致介紹(英文)
5.?WAP Push SMS encoding
????????WAP PUSH Service Indication封裝實(shí)例(英文)
6.?Sending SMS WAPPush messages using the ActiveXperts SMSand MMS Toolkit
????發(fā)送WAP PUSH的工具。是使用說(shuō)明,雖然沒(méi)實(shí)現(xiàn)細(xì)節(jié),但可參考WBXML的Token和Attribute對(duì)照。(英文)
?
?
總結(jié)
以上是生活随笔為你收集整理的WAP PUSH解析(3)——Android中实现的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: std::function和std::b
- 下一篇: android开机logo制作工具,An