本文轉載自http://blog.csdn.net/hitlion2008/article/details/7408638,感謝原作者對於我的啓發。
Android當中的Mms對MMS(Multimedia Messaging Service)的操作關乎MMS協議部分都是通過Frameworks中提供的API來完成的:com.google.android.mms這個包在SDK中是不開放的,只能供內部程序使用,它封裝了所有MMS所需要的API。
這個包就是Android中對MMS協議的實現,包括一些數據結構:GenericPdu,MultimediaMessagePdu,SendReq,SendConf,NotificationInd,RetrieveConf,PduHeaders,PduBody,PduPart等。也包括操作這些數據的類:PduPersister,PduParser和PduComposer。PduPersister主要供給Android內部的應用程序使用;而PduParser和PduComposer會涉及到PDU相關的協議,會與MMSC或其他平臺有相互影響(比如所打包的字節流是否符合標準,能否被其他平臺成功解析和識別等)這個包的功能就是在發送時把多媒體數據打包成標準MMSC能識別的PDU格式數據,在接收時把PDU數據包解析出來以供更加方便的應用程序使用,同時也提供一些存儲上的接口,比如把PDU保存到數據庫,從數據庫加載出PDU。
Class | Purpose |
---|---|
PduPersister | 用於管理PDU存儲 |
PduParser | 用於解析PDU |
PduComposer | 用於生成PDU |
PduPersister: 用於管理PDU存儲,關鍵的方法:
Return |
Method |
Description |
---|---|---|
PduPersister |
getPduPersister(Context) |
Get the object |
Uri |
persist(GenericPdu, Uri) |
把一個GenericPdu保存到Uri所指定的數據庫中,返回指向新生成數據的Uri |
GenericPdu |
load(Uri) |
從數據庫把Uri所指的數據加載出來成一個GenericPdu對象 |
Uri |
move(Uri, Uri) |
把Pdu從一個地方移到另一個地方,比如從草稿箱移動到發件箱,當MMS已發送時。 |
爲什麼會要把PDU的存儲也封裝成PduPersister呢?因爲PDU的存儲方式 是放在標準的SQLiteDatabase中,通過TelephonyProvider,而SQLiteDatabase中存儲不能以直接的PDU的字節流來存儲,必須要把PDU拆解成爲可讀的字段,因此在存儲PDU和從存儲加載PDU的過程 中涉及到PDU數據上面的處理,因此封裝出來,更方便使用。
PduParser:用於把PDU字節流解析成爲Android可識別的GenericPdu
Return | Method | Description |
---|---|---|
PduParser | PduParser(byte[]) | Construct an object |
GenericPdu | parse() | Parse the PDU byte stream into Android PDU GenericPdu |
PduComposer:把GenericPdu打包生成PDU字節流
Return | Method | Description |
---|---|---|
PduComposer | PduComposer(Context, GenericPdu) | Construct an object |
byte[] | make() | Transfer the GenericPdu into a PDU byte stream |