歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
您现在的位置: Linux教程網 >> UnixLinux >  >> Linux編程 >> Linux編程

Android Mms專題之:MMS支持

Composing and editing

MMS在Android Mms應用裡面的具體實現形式,或數據結構是SlideshowModel,它是一個每個節點為SlideModel的ArrayList,SlideModel是一個Model的List,也就是它可以接收任何Model的子類,Audio,Video,Image和Text都可以放到SlideModel上面。SlideModel主要用於管理其上面的各個媒體,比如它們的布局,它們的播放控制,而SlideshowModel主要用於管理所有的附件,比如把所有的附件轉化成為Android的MMS協議的數據類型Pdu,以及從Pdu轉化成為SlideshowModel。
Pdu是實現了MMS協議的標准格式,它可以直接的發送給MMSC,從MMSC取回來的也是一個Pdu格式的數據。應用層Mms不需要關心Pdu的具體實現方式,Android中有一個內部的包com.google.android.mms.*下面的類都是專門用於處理Android平台上的MMS。裡面提供了工作可以把應用層的數據,比如媒體文件等,進行包裝成Pdu,再把Pdu分解成為媒體文件。Pdu的數據結構包括PduBody,這個是用於存放多媒體文件的地方,其裡面是PduPart的集合,每個PduPart代表一個文件。PduPersister用於操作這些數據結構,包括寫入數據庫,從數據庫中讀取等。
SlideshowModel或俗稱幻燈片是應用層的MMS的實現形式,或者它是應用層MMS用來創建,編輯,顯示和管理多媒體的一個數據結構。創建和發送MMS的時候,就是創建一個SlideshowModel,構建MediaModel,TextModel等加入到SlideshowModel中。在發送時,SlideshowModel會把其內的媒體文件取出來,轉化為PduPart放入PduBody中。收到信息後從PduBody中取出PduPart,還原成媒體文件,生成MediaModel,加入到SlideshowModel中,也就是還原為幻燈片。應用拿到幻燈片後可以做顯示和播放。

附件類型

關於附件類型,Mms應用中所有的MMS都有一個幻燈片,其內含有所有的附件文件。但是Mms做了一些特殊的處理,對於一個MMS信息,它的附件類型分為IMAGE, AUDIO, VIDEO,和SLIDESHOW,這些從添加附件對話框的列表中可以看出,而且展現方式也有所不同。但是實際的實現上面並沒有這麼多的類型,只有一個SlideshowModel,所有的附件都在裡面。它處理的規則是這樣的,如果只添加了一個媒體(image, audio和video)時,會把類型設置為相應的媒體類型,而只有在附件對話框中明確選擇添加幻燈片時並且添加了多張幻燈片後,附件類型才會是幻燈片。這個附件類型只在給MMS添加附件時和發送MMS前有效,主要用於在消息列表中如何展示媒體文件,如果是具體媒體類型,就直接顯示,否則顯示為幻燈片,這個附件類型僅存在於應用中顯示媒體所用,並不會在發送出去的Pdu中有痕跡。當收到MMS後,也是根據轉化後的SlideshowModel裡面的內容來推測出附件類型,然後再做顯示。所以,對於一個MMS來說它始終都有一個SlideshowModel,用戶所感受到的附件類型僅是附件媒體顯示上面的一個處理而已。

創建和編輯MMS

與傳統手機不同,創建MMS並不需要特殊的方式。因為Mms應用對MMS和SMS並不做嚴格的區分,而是以統一的對話中的一個消息來對待,所以MMS與SMS的區別也很簡單,就看一個消息中只否有附件(WorkingMessage.hasAttachment())。創建MMS也十分簡單,只需點擊Composer而的Attach菜單添加媒體即可。在列表中選擇image, audio和video後就只有一個媒體文件,都會跑到其他的Activity去選擇文件,然後會返回其Uri給Composer,Composer會調用WorkingMessage.setAttachment()來做具體的添加,用Uri創建MediaModel然後加入到SlideshowModel中,並設置類型。另外,如果選擇了Attach幻燈片,就會直接進入編輯幻燈片的而面,可以添加刪除幻燈片頁,給幻燈片頁加媒體文件,設置布局等,之後Composer會把SlideshowModel顯示出來,此時的附件類型也是SLIDESHOW,這些都是通過WorkingMessage.load()來完成的。
WorkingMessage在把媒體加到幻燈片裡以後,就會回調一個接口 onAttachmentChanged(),Composer實現了此接口,這個接口主要用於通知Composer附件已發生變化,刷新UI以正確顯示附件。Composer會創建AttachmentEditor來顯示附件的內容,因為所有的附件都放在Slideshow裡面這個Slideshow在WorkingMessage中,可以通過WorkingMessage.getSlideshow()來獲取。AttachmentEditor會根據Slideshow裡面的內容來創建不同的View以展示不同的附件,如果Slideshow中只有一個Video,Audio或Image,就直接創建VideoAttachmentView,AudioAttachmentView或ImageAttachmentView,而對於幻燈片中頁數大於1時就會創建SlideshowAttachmentView。還有相應的按扭可以用來編輯,替換或刪除,對於單個媒體有查看/播放,選擇後可以查看原圖和播放音頻視頻,替換可以重新重選擇一個附件,刪除會移除掉附件;對於Slideshow有編輯和刪除,編輯會直接進入幻燈片的編輯頁面,那裡可以一頁一頁的對每頁幻燈片進行詳細的編輯,刪除會移除掉附件。
編輯完附件後有三種處理方式,一個是發送信息,一個是保存為草稿另一個就是放棄信息。發送信息和保存草稿都會對幻燈片進行打包,轉成Pdu,並保存到數據庫,之後的幻燈片都需要從數據庫加載並把Pdu解包成為SlidehshowModel。

Packaging and unpackaging MMS

要發送信息前,或是保存草稿時,都需要把SlideshowModel進行打包生成Pdu格式,並保存至數據庫。這個稱為MMS的打包(Packaging),是由SlideshowModel.makePduBody()方法來完成,它會把幻燈片裡面的內容一個一個的取出來,轉成一個PduPart,再 放入PduBody中,以生成PduBody,一個媒體對應一個PduPart,同時還可以設置PduPart的屬性以描述媒體的文件,比如ContentType,這是一個用於標識媒體MIME類型的字串;Filename文件的名字; ContentLocation文件的路徑。這些信息都用於描述PduPart中數據的元信息(MetaData),也就是數據具體是什麼,以便讓解包的時候對數據進行正確的處理。
之後PduPersister會通過其persist()方法把PduBody存入到數據庫中,它會把PduPart中的描述性信息作數據庫字段寫入,把文件存儲在TelephonyProvider文件夾下面(/data/data/android.providers.telephony/app_parts),並把存儲後的路徑作為_data字段寫入數據庫,這樣一條MMS的數據就都寫入了數據庫中。這以後,MMS的數據都是從數據庫中加載,所以原SlideshowModel中的數據庫不再有效,如Uri在原SlideshowModel中可能指向一個文件,或是其他數據庫,在PduPersister.persist()之後就不再有效了。
當PduPersister.persist()之後,MMS的附件就都從數據中加載,PduPersister.load()會從數據庫把數據加載成為一個PduBody,SlideshowModel的方法createFromPduBody()就是用於把PduBody轉化成為一個SlideshowModel,從PduPart取出媒體信息以得到正確的媒體格式,和相關信息,可以通過Uri來獲取具體文件(流)。
接收到的MMS過程也差不多當NotificationTransaction或RetrieveTransaction用HttpUtils從MMSC獲取到MMS數據後會用PduParser來解析數據生成Pdu,再用PduPersister.persist()把其寫入數據庫,之後會再從數據庫中加載。
Copyright © Linux教程網 All Rights Reserved