Android-MMS中彩信附件的格式及分析
一、 概述
MMS彩信大家都看到过,或者都编辑过。在这里,利用一系列的文章来说明彩信的编辑、发送和接收的过程。首先这里,简单描述一下彩信的编辑过程。这是彩信的第一步。
二、MMS的表述(presentation)语言——SMIL概述
MMS由一系列类似于“power point style”类型的slide组成,由这些slide来组织各种格式的文本、音频、视频信息。这些我们在发送或者接受彩信的时候都有切身的体会,就不说了。
为了把这些多媒体信息组织到一起,通过网络发送,并且这些信息在接收者那里能够保证按照发送者的样式进行播放。这里就需要采用一种技术,用于描述彩信的组织和播放方法。这种方法就是利用SMIL语言。看过这个语言的规范之后,我想大部分熟悉HTML和XML的人都会会心的笑了,的确,这就是SMIL语言。
MMS使用SMIL(Synchronized Multimedia Integration Language)的子集作为表述语言,SMIL是由W3C(world wide web consortium)制定的基于XML的表述语言标准(可以参见附录中之处的RFC文档)。相当于HTML之于web。SMIL语言可以控制多媒体对象的layout和timing(播放时间)。
在初期,MMS只使用了SMIL的简单基础子集,称作“MMS SMIL”。每个MMS信息都是由SMIL表述语言文件组成。在这个文件中所有的slide有相同的layout。每个slide至少包含两个region,一个包含文本,一个包含图像。事实上,每个slide都是一个frame,每个frame包含layout和指向内容(text、images、audio、video)的索引。每个slide的播放周期以秒计算,在每个slide的内部,文本和图像的播放时间可以单独设定。
由于每个移动设备的尺寸不尽相同,所以SMIL被设计成可以根据终端的不同表现形式作以重新安排。简单说来,SMIL具有下列特点:
§来自于W3C的规范定义
§SMIL只是简单地限定了各种message元素在何时、在什么地方显式
§SMIL文件以<smil>标记开始,接下来是head和body标记,最后以</smil>结束
§Head标记元素限定了
§Body标记元素限定了被插入内容的参考索引(references),并且限定了何时、何地播放以及每个元素播放的时间。
下面一段文字来自于IBM,说明了在MMS之外SMIL的广泛用途。
SMIL 2.0是同步多媒体集成语言(Synchronized Multimedia Integration Language),它已开始成为将多媒体集成到Web 内容的重要新方法。SMIL 提供基于 XML 的方法来控制多媒体元素的定时和表示,它已开始获得众多大的软件供应商和工具制作商的支持,这使得开发人员使用它变得越来越容易。 SMIL支持已开始成为 Adobe、Microsoft以及(也许是最重要的)媒体传递领先者 Real Networks 支持的技术之一。众多较小的供应商已开始提供SMIL 创作工具和播放器。 在不久的将来,随着对当前2.0 规范支持的增长,对于任何在工作中需要某种形式的多媒体资产控制的开发人员,使用 SMIL将成为他们的标准策略。如果把正在增长的工具创建者的名单作为某种指示,那么用SMIL 构建表示也会变得更简单。 |
正如前面提到的那样,最广泛的 SMIL 2.0 实现可能来自 Real Networks。RealOne Player支持 SMIL 2.0 语言概要文件(SMIL 2.0 Language Profile),它结合了SMIL 支持的大多数(尽管不是全部)模块。除了支持大多数标准 SMIL 模块以外,RealNetworks 还开发了自己的几个 SMIL 扩展。要使用这些扩展,开发人员必须遵守标准 XML 声明. 通过使用少量的一系列基于 SMIL 的 XML 元素和属性,Microsoft的 HTML+TIME 给 HTML 页面添加了定时和多媒体支持。为了给 HTML 文档添加定时,开发人员要向现有的 HTML 元素添加新属性。创建新元素是为了使向HTML 页面添加媒体变得简单。 为了使用任何HTML+TIME 元素,开发人员必须在 HTML 标记中声明 XML 名称空间 t: 不同于上述这两个供应商,大多数创作工具和播放器开发人员主要分为两种, § 一种是只关注 SMIL 的完整台式机部署 § 另一种至少要关心一下用于占用资源较小的移动设备的基本SMIL 2.0 子集。 此外,随着无线网络的发展,关注MMS 部署的 SMIL 播放器应该对 SMIL 创作有新的考虑。 |
三、 SMIL简单示例
下面给出了一个MMS消息的SMIL示例:
<smil> <head> <meta name="title" content="vacation photos" /> <meta name="author" content="Danny Wyatt" /> <layout> <root-layout width="160" height="120"/> <region id="Image" width="100%" height="80" left="0" top="0" /> <region id="Text" width="100%" height="40" left="0" top="80" /> </layout> </head> <body> <par dur="8s"> <img src="FirstImage.jpg" region="Image" /> <text src="FirstText.txt" region="Text" /> <audio src="FirstSound.amr"/> </par> <par dur="7s"> <img src="SecondImage.jpg" region="Image" /> <text src="SecondText.txt" region="Text" /> <audio src="SecondSound.amr" /> </par> </body> </smil> |
具体的SMIL描述语言的解释可以参见附录的参考文档,那里给出了每种标记的解释说明。
至于在手机软件上实现,也不是很困难的事情。想想看。
利用结构数组,把所有的MMS中的slide存储到其中,最后,结合SMIL语言的规范,把彩信
打包成上述文件的格式,注意,这里,并不需要把具体的多媒体文件内容添加到smil文件中,只需要加在smil文件中,作为附件就可以了。具体的数据的加载,请看下一篇——MMS的打包部分吧!
参考资料:
Nokia:
[N1] How_To_Create_MMS_Services.pdf http://www.forum.nokia.com
[N2] MMSCenterAppDevGuide.pdf http://www.forum.nokia.com
OMA:
[O1] WAP-205-MMSArchOverview-20010425-a.pdf
一、MMS的封装(Encapsulation)——MIME
对于使用SMIL语言描述的MMS,在通过无线网络发送的时候,我们必须通过某种方式把SMIL和附属的内容包装在一起,一边能够以一个unit(整体)的形式发送出去,以便SMIL文件各个部分内容的reference变得有效。
这个解决的办法就是MIME(Multipart Internet Mail Extensions)规范,这个规范的最初作用是在email的plain text的主体中加入不同的内容。比如说,发送带有附件的email,这个时候你就使用了MIME的规范。MIME负责把所有的独立的文本、图像、声音、视频内容以及SMIL文件本身捆绑在一起,这个规范称为MIME Encapsulation Aggregate Documents,用于告诉接受的终端这个MMS的内容是相互相关(related to one another)并且相互参考的(referenced to one another)。
1. MIME封装示例
下面是根据RFC文档给出的MIME的封装示例:
Content-Type: multipart/related; boundary="boundary-example"; type="text/html" --boundary-example Content-Type: text/html; charset="US-ASCII" ... ... <IMG SRC="fiction1/fiction2"> ... ... ... ... <IMG SRC="cid:97116092811xyz@foo.bar.net"> ... ... --boundary-example Content-Type: image/gif Content-ID: <97116092511xyz@foo.bar.net> Content-Location: fiction1/fiction2 --boundary-example Content-Type: image/gif Content-ID: <97116092811xyz@foo.bar.net> Content-Location: fiction1/fiction3 --boundary-example-- |
§Content-type
位于信息头部的content-type用于通知接收的终端消息的各个不同部分的内容是相互关联的、并且可能是相互索引的(refer to one another)。
§Boundary
Boundary用于分割各个不同的消息part。第一个部分是一个html类型的消息,这里只是取得了相关的部分。第二和第三部分省略了实际的images图像的实体。
§Location and ID
在HTML文本部分我们可以看到,我们可以利用两种方式来索引消息内容的不同部分。这两种不同的方式是content-ID 和 content – Location。
如果一部分的消息体想通过content-ID指向(refer to)另外一部分的消息体,可以使用“CID”.
关于MIME的部分的信息可以参考附录中列出的RFC文档(RFC2387和RFC2357)。
2. 利用MIME封装MMS的示例
下面给出一个利用MIME封装MMS的示例:
Content-Type: multipart/related; Type="application/smil"; Start="<AAAA>";boundary="----=_Part_24362_271418.1110357304160" ------=_Part_24362_271418.1110357304160 content-type: text/x-vCalendar;Charset=UTF-8;Name="slide1.vcs" content-id: <slide1.vcs> content-location: slide1.vcs Content-Transfer-Encoding: base64 QkVHSU46VkNBTEVOREFSDQpWRVJTSU9OOjEuMA0KQkVHSU46VkVWRU5UDQpEVFNUQVJUOjIwMDUw MzA4VDA5MDAwMFoNCkRURU5EOjIwMDUwMzA4VDEwMDAwMFoNClNVTU1BUlk7Q0hBUlNFVD1VVEYt ODtFTkNPRElORz1RVU9URUQtUFJJTlRBQkxFOuaYr+WQpg0KQ0FURUdPUklFUztDSEFSU0VUPVVU Ri04O0VOQ09ESU5HPVFVT1RFRC1QUklOVEFCTEU6QVBQT0lOVE1FTlRTDQpFTkQ6VkVWRU5UDQpF TkQ6VkNBTEVOREFSDQo= ------=_Part_24362_271418.1110357304160 content-type: application/smil;Charset=UTF-8;Name="20050309163706.smil" content-id: <AAAA> Content-Transfer-Encoding: base64 PHNtaWw+PGhlYWQ+PGxheW91dD48cm9vdC1sYXlvdXQgd2lkdGg9IjE3NiIgaGVpZ2h0PSIxNzQi Lz48cmVnaW9uIGlkPSJmdWxsIiB3aWR0aD0iMTc2IiBoZWlnaHQ9IjE3NCIgbGVmdD0iMCIgdG9w PSIwIiAvPjwvbGF5b3V0PjwvaGVhZD48Ym9keT48cGFyIGR1cj0iNXMiPjx0ZXh0IHNyYz0ic2xp ZGUxLnZjcyIgcmVnaW9uPSJmdWxsIiAvPjwvcGFyPjwvYm9keT48L3NtaWw+ ------=_Part_24362_271418.1110357304160-- |
下图给出的图示说明各个部分之间的关系:
3. 一个完整的MIME封装MMS示例
下表给出了一个完整的MIME封装MMS的示例:
MIME Object |
|
Date:Fri, 14 Dec 2001 15:13:21-0500 (EST) X-Mms-Expiry: Thu,20 Dec 2001 21:52:25-0500 (EST) X-Mms-Delivery-Time:Wed, 19 Dec 2001 21:52:25-0800 (PST) X-Mms-Priority:Normal X-Mms-Sender-visibility: Show X-Mms-Message-Class: Personal X-Mms-Delivery-report: yes X-Mms-3GPP-MM3-Version: 4.3.0 From: mms-email-sample@sample-email.ericsson.com To: +12345@mmc.sample-mms.ericsson.com Subject: Sample SMIL Mime-Version: 1.0 Content-Type: multipart/related; boundary="---- =_MIME_Boundary_MMS_Reference_Sample_001" |
MIME Headers |
"----=_MIME_Boundary_MMS_Reference_Sample_001" |
MIME Start boundary |
Content-ID: <index.smil> Content-Type: application/smil; charset="US-ASCII"; name=index.smil <smil> <head> <layout><root-layout/> <region id="region1_2" top="0" left="0" height="100%" width="100%"/> <region id="region1_1" top="0" left="0" height="100%" width="100%"/> </layout> </head> <body> <par dur="2000ms"> <text src="Cid:image" region="region1_2"/> </par> <par dur="2000ms"> <img src="Cid:txt" region="region1_1" fit="fill"/> </par> </body> </smil> |
SMIL document |
"----=_MIME_Boundary_MMS_Reference_Sample_001" |
MIME boundary |
Content-Type: text/plain; name=mms.txt Content-Transfer-Encoding: 7bit Content-ID: <txt> Content-Disposition: attachment; filename=mms.txt This is a sample MMS message, for use as a reference. |
Text Document |
"----=_MIME_Boundary_MMS_Reference_Sample_001" |
MIME boundary |
Content-Type: image/gif; name=sample.gif Content-Transfer-Encoding: base64 Content-ID: <image> Content-Disposition: attachment; filename=sample.gif R0lGODlhZQBQAPcAAOYeAClUpyAtb/XNjlo8RqoUFHSa2ZCKjHiCWrzf/2iQ1J m66Yeq4cXm/6ys <entire encoded image not shown for the sake of brevity> kBiJkjiJlFiJlniJmJiJmriJnNiJnviJoBiKogh5AQEAOw== |
Image |
"----=_MIME_Boundary_MMS_Reference_Sample_001" |
MIME boundary |
二、MMS的MIME结构
综述来说,每个MMS信息按照MIME规范的基本结构如下图所示:
从图示看出,每个MMS都是由MMS Header和MMS Body组成,MMS Header根据WAP-209协议和RFC2387的规定,由一系列的域组成,下表列出了部分的域(给出的示范的内容表示),其中有些是强制必须实现的(用黑体表示)。
X-Mms-Message-Type |
m-send-req |
X-Mms-Transaction-ID |
1234 |
X-Mms-MMS-Version |
1.0 |
Date |
星期五, 18三月 2005 06:43:40 GMT |
From |
mms-editor@toolkit |
To |
33333333333333 |
Cc |
33333333333333 |
Bcc |
|
Subject |
test |
X-Mms-Message-Class |
Personal |
X-Mms-Expiry |
星期六, 19三月 2005 06:43:40 GMT |
X-Mms-Delivery-Time |
星期五, 18三月 2005 06:43:40 GMT |
X-Mms-Priority |
low |
X-Mms-Sender-Visibility |
Show |
X-Mms-Delivery-Report |
No |
X-Mms-Read-Reply |
No |
Content-Type |
application/vnd.wap.multipart.related; start="<presentation-part>" type="application/smil" |
1. MMS承载的内容elements
MMS只是用于发送消息的载体,根据规范,我们可以发送各种不同类型的内容元素。这些内容元素组成MMS中各个不同的部分。根据元素类型的不容,每个part Header部分的content-type也不尽相同。下面给以示例:
文本:文本包含很多类型,普通文本的类型可以表示为——text/plain,而vcard类型的文本表示为text/x-vCard。
静态图像:静态图像存在各种不同的类型,根据不同的编码方式由不同的后缀名表示。如image/gif和image/jpeg。
音效是什么呢?没有介绍,应该是audio/mid 吧..
Android-MMS中彩信附件的格式及分析相关推荐
- fileoutputstream路径 android,Android编程中FileOutputStream与openFileOutput()的区别分析
本文实例分析了Android编程中FileOutputStream与openFileOutput()的区别.分享给大家供大家参考,具体如下: openFileOutput() 首先给大家介绍使用文件如 ...
- Android系统中如何得到各种格式的文件正文(office文件,PDF,邮件,html,zip等)
在Android平台下,办公系统,ERP,CRM等开发过程中,需要对Doc, docx, xls, xlsx, ppt, ppts, pdf, html等各种格式的文件内容进行搜索和查找,实现这些格式 ...
- android 彩信附件添加删除
添加附件. 在ComposeMessageActivity里 addAttachment(int type) 函数 根据type的不同,分成6个case case A: MediaSelectLis ...
- android 彩信接收到附件的下载原理分析
(之前有一位仁兄说博客布局在一些浏览器会出现阻挡文字,因此为了市民的方便(也就是me^0^),建议大家也用chrome来浏览,毕竟这个博客布局简明,我有点不想换) 彩信收发宏观步骤: a. 终端A向彩 ...
- 高通android 7.0彩信发送过程中使用到的google pdu
对于彩信与数据库的交互操作,google并没有将这部分代码放在Mms中,而是放在framework中的pdu部分. 具体代码路径是在:opt\telephony\src\java\com\google ...
- android 验证邮箱格式,android开发中, 如何验证邮箱的格式 ?
满意答案 moienrn77 2016.09.05 采纳率:56% 等级:9 已帮助:115人 在Android中,调用Email有三种类型的Intent: Intent.ACTION_SEND ...
- 深度分析:Android4.3下MMS发送到附件为音频文件(音频为系统内置音频)的彩信给自己,添加音频-发送彩信-接收彩信-下载音频附件-预览-播放(三,接收彩信2,下载彩信)
彩信的接收简介: 主要是由应用程序负责从彩信服务中心(MMSC Multimedia Messaging Service Center)下载彩信信息.大致的流程是Frameworks会先发出一条短信, ...
- Android Studio中的代码格式快捷方式
本文翻译自:Code formatting shortcut in Android Studio I have started developing with Android Studio . 我已经 ...
- 【Google Play】从 Android 应用中跳转到 Google Play 中 ( 跳转代码示例 | Google Play 页面的链接格式 | Google Play 免安装体验 )
文章目录 前言 一.从 Android 应用跳转到 Google Play 代码 二.Google Play 页面的链接格式 三.Google Play 免安装体验 前言 本博客参考资料 链接到 Go ...
最新文章
- 【poj3420】 Quad Tiling
- Windows7 64位机上Emgu CV2.4.2安装与配置
- 从AdventureWorks学习数据库建模——保留历史数据
- this - 想说爱你不容易
- 泊松分布E(X^2)
- wave文件 fft_STM32F103 如何实现 FFT?
- python post与get的区别_Python Requests库 Get和Post的区别和Http常见状态码
- 生活杂记 - 丢东西
- 每周收获(11-13)
- SpringBoot整合Quartz
- 微信小程序 自定义导航栏
- 工作-safari时间格式
- 韶大talk 评论热度抽取
- 前后端及常用语言介绍
- ESD防护方法及设计要点
- Amazon Shield Advanced 更新 – 自动应用程序层 DDoS 防御
- Android UI性能优化 检测应用中的UI卡顿
- 计算机c盘如何腾出空间,WIN8的C盘太大怎么清理腾出空间呢
- 闪存主控芯片国产进程
- 关于Android Https网络连接失败奇葩问题 ExtCertPathValidatorException
热门文章
- 我为什么鼓励你读计算机博士
- 21. 查询表sc——查询平均成绩大于等于90分的学生学号和平均成绩
- 关于微信小程序开发注意
- python OOP面向对象笔记
- RuntimeError: mat1 and mat2 shapes cannot be multiplied
- 设计新鲜事(News Feed)系统
- freertos和嵌入式linux区别,嵌入式工程师,你知道为什么要学RTOS?为什么要选用FreeRTOS?...
- 小米手机自带红外传感器安卓应用程序代码
- 互联网产品运营日记(1):上线首日
- mysql添加用户并赋予权限命令