自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

MMS之添加附件setattachment

移動(dòng)開(kāi)發(fā) Android
MMS 在Android Mms應(yīng)用里面的具體實(shí)現(xiàn)形式,或數(shù)據(jù)結(jié)構(gòu)是SlideshowModel,它是一個(gè)每個(gè)節(jié)點(diǎn)為SlideModel的 ArrayList,SlideModel是一個(gè)Model的List,也就是它可以接收任何Model的子類(lèi),Audio,Video,Image和 Text都可以放到SlideModel上面。SlideModel主要用于管理其上面的各個(gè)媒體,比如它們的布局,它們的播放控制,而 SlideshowModel主要用于管理所有的附件,比如把所有的附件轉(zhuǎn)化成為Android的MMS協(xié)議的數(shù)據(jù)類(lèi)型Pdu,以及從Pdu轉(zhuǎn)化成為 SlideshowModel。

MMS 在Android Mms應(yīng)用里面的具體實(shí)現(xiàn)形式,或數(shù)據(jù)結(jié)構(gòu)是SlideshowModel,它是一個(gè)每個(gè)節(jié)點(diǎn)為SlideModel的 ArrayList,SlideModel是一個(gè)Model的List,也就是它可以接收任何Model的子類(lèi),Audio,Video,Image和 Text都可以放到SlideModel上面。SlideModel主要用于管理其上面的各個(gè)媒體,比如它們的布局,它們的播放控制,而 SlideshowModel主要用于管理所有的附件,比如把所有的附件轉(zhuǎn)化成為Android的MMS協(xié)議的數(shù)據(jù)類(lèi)型Pdu,以及從Pdu轉(zhuǎn)化成為 SlideshowModel。

Pdu 是實(shí)現(xiàn)了MMS協(xié)議的標(biāo)準(zhǔn)格式,它可以直接的發(fā)送給MMSC,從MMSC取回來(lái)的也是一個(gè)Pdu格式的數(shù)據(jù)。應(yīng)用層Mms不需要關(guān)心Pdu的具體實(shí)現(xiàn)方式,Android中有一個(gè)內(nèi)部的包c(diǎn)om.google.android.mms.*下面的類(lèi)都是專(zhuān)門(mén)用于處理Android平臺(tái)上的MMS。里面提供了工作可以把應(yīng)用層的數(shù)據(jù),比如媒體文件等,進(jìn)行包裝成Pdu,再把Pdu分解成為媒體文件。Pdu的數(shù)據(jù)結(jié)構(gòu)包括PduBody,這個(gè)是用于存放多媒體文件的地方,其里面是PduPart的集合,每個(gè)PduPart代表一個(gè)文件。PduPersister用于操作這些數(shù)據(jù)結(jié)構(gòu),包括寫(xiě)入數(shù)據(jù)庫(kù),從數(shù)據(jù)庫(kù)中讀取等。

SlideshowModel或俗稱(chēng)幻燈片是應(yīng)用層的MMS的實(shí)現(xiàn)形式,或者它是應(yīng)用層MMS用來(lái)創(chuàng)建,編輯,顯示和管理多媒體的一個(gè)數(shù)據(jù)結(jié)構(gòu)。創(chuàng)建和發(fā)送MMS的時(shí)候,就是創(chuàng)建一個(gè)SlideshowModel,構(gòu)建MediaModel,TextModel等加入到 SlideshowModel中。在發(fā)送時(shí),SlideshowModel會(huì)把其內(nèi)的媒體文件取出來(lái),轉(zhuǎn)化為PduPart放入PduBody中。收到信息后從PduBody中取出PduPart,還原成媒體文件,生成MediaModel,加入到SlideshowModel中,也就是還原為幻燈片。應(yīng)用拿到幻燈片后可以做顯示和播放。

附件類(lèi)型

關(guān)于附件類(lèi)型,Mms應(yīng)用中所有的MMS都有一個(gè)幻燈片,其內(nèi)含有所有的附件文件。但是Mms做了一些特殊的處理,對(duì)于一個(gè)MMS信息,它的附件類(lèi)型分為 IMAGE, AUDIO, VIDEO,和SLIDESHOW,這些從添加附件對(duì)話(huà)框的列表中可以看出,而且展現(xiàn)方式也有所不同。但是實(shí)際的實(shí)現(xiàn)上面并沒(méi)有這么多的類(lèi)型,只有一個(gè) SlideshowModel,所有的附件都在里面。它處理的規(guī)則是這樣的,如果只添加了一個(gè)媒體(image, audio和video)時(shí),會(huì)把類(lèi)型設(shè)置為相應(yīng)的媒體類(lèi)型,而只有在附件對(duì)話(huà)框中明確選擇添加幻燈片時(shí)并且添加了多張幻燈片后,附件類(lèi)型才會(huì)是幻燈片。這個(gè)附件類(lèi)型只在給MMS添加附件時(shí)和發(fā)送MMS前有效,主要用于在消息列表中如何展示媒體文件,如果是具體媒體類(lèi)型,就直接顯示,否則顯示為幻燈片,這個(gè)附件類(lèi)型僅存在于應(yīng)用中顯示媒體所用,并不會(huì)在發(fā)送出去的Pdu中有痕跡。當(dāng)收到MMS后,也是根據(jù)轉(zhuǎn)化后的SlideshowModel里面的內(nèi)容來(lái)推測(cè)出附件類(lèi)型,然后再做顯示。所以,對(duì)于一個(gè)MMS來(lái)說(shuō)它始終都有一個(gè)SlideshowModel,用戶(hù)所感受到的附件類(lèi)型僅是附件媒體顯示上面的一個(gè)處理而已。

創(chuàng)建和編輯MMS

與傳統(tǒng)手機(jī)不同,創(chuàng)建MMS并不需要特殊的方式。因?yàn)镸ms應(yīng)用對(duì)MMS和SMS并不做嚴(yán)格的區(qū)分,而是以統(tǒng)一的對(duì)話(huà)中的一個(gè)消息來(lái)對(duì)待,所以MMS與 SMS的區(qū)別也很簡(jiǎn)單,就看一個(gè)消息中只否有附件(WorkingMessage.hasAttachment())。創(chuàng)建MMS也十分簡(jiǎn)單,只需點(diǎn)擊 Composer而的Attach菜單添加媒體即可。在列表中選擇image, audio和video后就只有一個(gè)媒體文件,都會(huì)跑到其他的Activity去選擇文件,然后會(huì)返回其Uri給Composer,Composer會(huì)調(diào)用WorkingMessage.setAttachment()來(lái)做具體的添加,用Uri創(chuàng)建MediaModel然后加入到 SlideshowModel中,并設(shè)置類(lèi)型。另外,如果選擇了Attach幻燈片,就會(huì)直接進(jìn)入編輯幻燈片的而面,可以添加刪除幻燈片頁(yè),給幻燈片頁(yè)加媒體文件,設(shè)置布局等,之后Composer會(huì)把SlideshowModel顯示出來(lái),此時(shí)的附件類(lèi)型也是SLIDESHOW,這些都是通過(guò) WorkingMessage.load()來(lái)完成的。

WorkingMessage在把媒體加到幻燈片里以后,就會(huì)回調(diào)一個(gè)接口 onAttachmentChanged(),Composer實(shí)現(xiàn)了此接口,這個(gè)接口主要用于通知Composer附件已發(fā)生變化,刷新UI以正確顯示附件。Composer會(huì)創(chuàng)建AttachmentEditor來(lái)顯示附件的內(nèi)容,因?yàn)樗械母郊挤旁赟lideshow里面這個(gè)Slideshow在 WorkingMessage中,可以通過(guò)WorkingMessage.getSlideshow()來(lái)獲取。AttachmentEditor會(huì)根據(jù) Slideshow里面的內(nèi)容來(lái)創(chuàng)建不同的View以展示不同的附件,如果Slideshow中只有一個(gè)Video,Audio或Image,就直接創(chuàng)建 VideoAttachmentView,AudioAttachmentView或ImageAttachmentView,而對(duì)于幻燈片中頁(yè)數(shù)大于1 時(shí)就會(huì)創(chuàng)建SlideshowAttachmentView。還有相應(yīng)的按扭可以用來(lái)編輯,替換或刪除,對(duì)于單個(gè)媒體有查看/播放,選擇后可以查看原圖和播放音頻視頻,替換可以重新重選擇一個(gè)附件,刪除會(huì)移除掉附件;對(duì)于Slideshow有編輯和刪除,編輯會(huì)直接進(jìn)入幻燈片的編輯頁(yè)面,那里可以一頁(yè)一頁(yè)的對(duì)每頁(yè)幻燈片進(jìn)行詳細(xì)的編輯,刪除會(huì)移除掉附件。

編輯完附件后有三種處理方式,一個(gè)是發(fā)送信息,一個(gè)是保存為草稿另一個(gè)就是放棄信息。發(fā)送信息和保存草稿都會(huì)對(duì)幻燈片進(jìn)行打包,轉(zhuǎn)成Pdu,并保存到數(shù)據(jù)庫(kù),之后的幻燈片都需要從數(shù)據(jù)庫(kù)加載并把Pdu解包成為SlidehshowModel。

Packaging and unpackaging MMS

要發(fā)送信息前,或是保存草稿時(shí),都需要把SlideshowModel進(jìn)行打包生成Pdu格式,并保存至數(shù)據(jù)庫(kù)。這個(gè)稱(chēng)為MMS的打包(Packaging),是由SlideshowModel.makePduBody()方法來(lái)完成,它會(huì)把幻燈片里面的內(nèi)容一個(gè)一個(gè)的取出來(lái),轉(zhuǎn)成一個(gè) PduPart,再放入PduBody中,以生成PduBody,一個(gè)媒體對(duì)應(yīng)一個(gè)PduPart,同時(shí)還可以設(shè)置PduPart的屬性以描述媒體的文件,比如 ContentType,這是一個(gè)用于標(biāo)識(shí)媒體MIME類(lèi)型的字串;Filename文件的名字; ContentLocation文件的路徑。這些信息都用于描述PduPart中數(shù)據(jù)的元信息(MetaData),也就是數(shù)據(jù)具體是什么,以便讓解包的時(shí)候?qū)?shù)據(jù)進(jìn)行正確的處理。

之后PduPersister會(huì)通過(guò)其persist()方法把PduBody存入到數(shù)據(jù)庫(kù)中,它會(huì)把PduPart 中的描述性信息作數(shù)據(jù)庫(kù)字段寫(xiě)入,把文件存儲(chǔ)在TelephonyProvider文件夾下面(/data/data /android.providers.telephony/app_parts),并把存儲(chǔ)后的路徑作為_(kāi)data字段寫(xiě)入數(shù)據(jù)庫(kù),這樣一條MMS的數(shù)據(jù)就都寫(xiě)入了數(shù)據(jù)庫(kù)中。這以后,MMS的數(shù)據(jù)都是從數(shù)據(jù)庫(kù)中加載,所以原SlideshowModel中的數(shù)據(jù)庫(kù)不再有效,如Uri在原 SlideshowModel中可能指向一個(gè)文件,或是其他數(shù)據(jù)庫(kù),在PduPersister.persist()之后就不再有效了。

當(dāng) PduPersister.persist()之后,MMS的附件就都從數(shù)據(jù)中加載,PduPersister.load()會(huì)從數(shù)據(jù)庫(kù)把數(shù)據(jù)加載成為一個(gè)PduBody,SlideshowModel的方法createFromPduBody()就是用于把PduBody轉(zhuǎn)化成為一個(gè) SlideshowModel,從PduPart取出媒體信息以得到正確的媒體格式,和相關(guān)信息,可以通過(guò)Uri來(lái)獲取具體文件(流)。

接收到的 MMS過(guò)程也差不多當(dāng)NotificationTransaction或RetrieveTransaction用HttpUtils從MMSC獲取到 MMS數(shù)據(jù)后會(huì)用PduParser來(lái)解析數(shù)據(jù)生成Pdu,再用PduPersister.persist()把其寫(xiě)入數(shù)據(jù)庫(kù),之后會(huì)再?gòu)臄?shù)據(jù)庫(kù)中加載。

SMIL語(yǔ)言支持

對(duì)于每條MMS還有一個(gè)很重要的數(shù)據(jù)就是SMIL語(yǔ)言,SMIL是同步多媒體集成語(yǔ)言的簡(jiǎn)稱(chēng)(Synchronized Multimedia Integration Language),它與HTML文檔很類(lèi)似,是W3C(World Wide Web Consortium)組織規(guī)定的多媒體操縱標(biāo)準(zhǔn)語(yǔ)言。MMS也是用它來(lái)管理和播放多媒體。來(lái)看一個(gè)具體的SMIL語(yǔ)言實(shí)例:

  1. <smil xmlns="http://www.w3.org/2000/SMIL20/CR/Language">   
  2.         <head>   
  3.                 <layout>   
  4.                         <root-layout width="360" height="615"/>   
  5.                         <region id="Image" width="347" height="260" top="14" left="7" fit="meet"/>                                  
  6.                         <region id="Text" width="326" height="320" top="281" left="7" fit="scroll"/>   
  7.                 </layout>   
  8.         </head>   
  9.         <body>   
  10.                 <par dur="60s">   
  11.                         <img src="0.jpg" region="Image"/>   
  12.                         <text src ="0.txt" region="Text"/>   
  13.                 </par>   
  14.                 <par dur="60s">   
  15.                         <text src ="1.txt" region="Text"/>   
  16.                 </par>   
  17.                 <par dur="60s">   
  18.                         <text src ="2.txt" region="Text"/>   
  19.                 </par>   
  20.                 <par dur="60s">   
  21.                         <text src ="3.txt" region="Text"/>   
  22.                 </par>   
  23.                 <par dur="60s">   
  24.                         <text src ="4.txt" region="Text"/>   
  25.                 </par>   
  26.         </body>   
  27. </smil>   

SMIL 語(yǔ)言播放多媒體時(shí)通常是一頁(yè)頁(yè)的,與幻為播放十分類(lèi)似,因?yàn)楹芏郤MIL播放器都會(huì)做成幻燈片形式。因?yàn)镸MS用SMIL來(lái)傳送多媒體,所以Mms終端應(yīng) 用都會(huì)以幻燈片的方式來(lái)播放MMS。這也就是為什么Mms應(yīng)用中會(huì)出來(lái)SlideshowModel的原因?;脽羝绞斤@示彩信是一種常用的方法,即使某 些終端應(yīng)用沒(méi)有用幻燈片放映的方式顯示彩信,但是對(duì)于運(yùn)營(yíng)商或彩信平臺(tái)發(fā)出來(lái)彩信都有頁(yè)碼標(biāo)識(shí),另外其他的一些手機(jī),比如非智能手機(jī)查看彩信的方式也是以 幻燈片一頁(yè)一頁(yè)的放映。

它主要記載著用于幻燈片的布局信息。這個(gè)SMIL語(yǔ)言就是用于幻燈片布局的,也就是說(shuō)SMIL會(huì)像HTML文檔布局網(wǎng)頁(yè)那 樣來(lái)說(shuō)明如何布局幻燈片,它有這些TAG:head, layout, body, par,head是頭信息,里面有TAG layout用來(lái)說(shuō)明這個(gè)幻燈片是如何布局的,具體的它用一些子TAG如root-layout, region等來(lái)說(shuō)明幻燈片中的每一個(gè)元素如Image或Text如何布局。TAG body中列出了幻燈片的所有媒體元素和詳細(xì)內(nèi)容,比如image, audio, text等,每一par是一頁(yè),它的子TAG說(shuō)明這一頁(yè)有哪些內(nèi)容,當(dāng)然SMIL語(yǔ)言還有很多內(nèi)容可以參考Wikipedia上的講解。

當(dāng) 打包幻燈片時(shí),也就是把SlideshowModel轉(zhuǎn)化為Pdu時(shí),會(huì)根據(jù)SlideshowModel的內(nèi)容生成一個(gè)SMIL語(yǔ)言,通過(guò) SmilHelper.getDocument()來(lái)生成SMIL文檔,把其加入到PduBody中并作為***個(gè)PduPart,它的 ContentType(MIME)是application/smil,它的內(nèi)容就是SMIL文檔。需要注意的是SMIL文檔總是會(huì)在PduBody的 ***個(gè)Part,并且它直接把文檔內(nèi)容寫(xiě)到PduPart中,而不是以文件的形式存在。

當(dāng)解包的時(shí)候,會(huì)先取出SMIL文檔,對(duì)其進(jìn)行解析,生成幻燈片。

因 為SMIL是一個(gè)標(biāo)準(zhǔn)的文檔,所以W3C有其相應(yīng)的規(guī)范,也有相應(yīng)的庫(kù)來(lái)解析和生成。在Mms應(yīng)用中可以看到這樣的二個(gè)Package: org.w3c.dom.*和com.android.mms.dom.*;其中org.w3c.dom是SMIL語(yǔ)言的一些標(biāo)準(zhǔn)庫(kù),而 com.android.mms.dom.*;是對(duì)org.w3c.dom一些標(biāo)準(zhǔn)接口的實(shí)現(xiàn),或者說(shuō)是為了Mms應(yīng)用而做的一些適配。那么在 com.android.mms.model.*里面的一些類(lèi)也是根據(jù)SMIL標(biāo)準(zhǔn)而寫(xiě)的,比如SmilHelper就是專(zhuān)門(mén)用于解析SMIL文檔和生成 SMIL文檔,當(dāng)然它會(huì)用到前面提到的二個(gè)Package里面的東西。還有如ImageModel,TextModel和RegionModel也都是基 于SMIL標(biāo)準(zhǔn)的,比如它們分別 對(duì)應(yīng)SMIL文檔中的標(biāo)簽img, text和region。

當(dāng)然,這都是具體的終端應(yīng)用的實(shí)現(xiàn),可能不同的應(yīng)用會(huì)有不同的方式,但發(fā)送出去的和接收到的都應(yīng)該是標(biāo)準(zhǔn)的Pdu,而SMIL文檔僅是一個(gè)其中一個(gè)PduPart而已。

責(zé)任編輯:chenqingxiang 來(lái)源: cnblogs
相關(guān)推薦

2011-04-11 15:19:53

Access 2007數(shù)據(jù)庫(kù)附件

2014-09-11 12:12:48

郵箱大師

2011-11-04 10:22:43

Java Mail

2019-09-24 11:21:23

工控安全MMS協(xié)議傳輸協(xié)議

2012-12-11 10:15:02

Winform開(kāi)發(fā)框架

2011-09-30 09:55:33

MongoDB

2022-01-09 00:15:55

安全郵件附件

2009-06-17 10:21:34

ASP.NET多附件上

2014-04-29 14:05:02

OpenGL ESAndroid添加動(dòng)作

2011-08-01 16:50:28

Xcode 動(dòng)態(tài) View

2024-10-10 16:05:04

2010-05-11 11:16:14

互聯(lián)網(wǎng)

2010-06-25 08:51:46

ASP.NET MVC

2011-08-01 17:01:02

Xcode WindowBase View

2021-07-30 10:38:40

Linux工具系統(tǒng)

2011-06-22 15:56:19

外鏈SEO

2011-06-10 10:00:16

Qt 數(shù)據(jù)庫(kù) MySQL

2009-08-14 11:15:19

文件監(jiān)視C#Windows服務(wù)

2011-08-30 16:43:46

MTK開(kāi)發(fā)菜單

2009-12-07 09:13:05

取消PHP上傳限制
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)