我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Android Mms之:深入MMS支持

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

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()把其写入数据库,之后会再从数据库中加载。
SMIL语言支持
对于每条MMS还有一个很重要的数据就是SMIL语言,SMIL是同步多媒体集成语言的简称(Synchronized Multimedia Integration Language),它与HTML文档很类似,是W3C(World Wide Web Consortium)组织规定的多媒体操纵标准语言。MMS也是用它来管理和播放多媒体。来看一个具体的SMIL语言实例:
代码如下:
<smil xmlns="/file/upload/202206/06/exdhqeze3kq" region="Image"/>
                        <text class="lazy" data-src ="0.txt" region="Text"/>
                </par>
                <par dur="60s">
                        <text class="lazy" data-src ="1.txt" region="Text"/>
                </par>
                <par dur="60s">
                        <text class="lazy" data-src ="2.txt" region="Text"/>
                </par>
                <par dur="60s">
                        <text class="lazy" data-src ="3.txt" region="Text"/>
                </par>
                <par dur="60s">
                        <text class="lazy" data-src ="4.txt" region="Text"/>
                </par>
        </body>
</smil>

SMIL语言播放多媒体时通常是一页页的,与幻为播放十分类似,因为很多SMIL播放器都会做成幻灯片形式。因为MMS用SMIL来传送多媒体,所以Mms终端应用都会以幻灯片的方式来播放MMS。这也就是为什么Mms应用中会出来SlideshowModel的原因。幻灯片方式显示彩信是一种常用的方法,即使某些终端应用没有用幻灯片放映的方式显示彩信,但是对于运营商或彩信平台发出来彩信都有页码标识,另外其他的一些手机,比如非智能手机查看彩信的方式也是以幻灯片一页一页的放� ��。
它主要记载着用于幻灯片的布局信息。这个SMIL语言就是用于幻灯片布局的,也就是说SMIL会像HTML文档布局网页那样来说明如何布局幻灯片,它有这些TAG:head, layout, body, par,head是头信息,里面有TAG layout用来说明这个幻灯片是如何布局的,具体的它用一些子TAG如root-layout, region等来说明幻灯片中的每一个元素如Image或Text如何布局。TAG body中列出了幻灯片的所有媒体元素和详细内容,比如image, audio, text等,每一par是一页,它的子TAG说明这一页有哪些内容,当然SMIL语言还有很多内容可以参考Wikipedia上的讲解。
当打包幻灯片时,也就是把SlideshowModel转化为Pdu时,会根据SlideshowModel的内容生成一个SMIL语言,通过SmilHelper.getDocument()来生成SMIL文档,把其加入到PduBody中并作为第一个PduPart,它的ContentType(MIME)是application/smil,它的内容就是SMIL文档。需要注意的是SMIL文档总是会在PduBody的第一个Part,并且它直接把文档内容写到PduPart中,而不是以文件的形式存在。
当解包的时候,会先取出SMIL文档,对其进行解析,生成幻灯片。
因为SMIL是一个标准的文档,所以W3C有其相应的规范,也有相应的库来解析和生成。在Mms应用中可以看到这样的二个Package: org.w3c.dom.*和com.android.mms.dom.*;其中org.w3c.dom是SMIL语言的一些标准库,而com.android.mms.dom.*;是对org.w3c.dom一些标准接口的实现,或者说是为了Mms应用而做的一些适配。那么在com.android.mms.model.*里面的一些类也是根据SMIL标准而写的,比如SmilHelper就是专门用于解析SMIL文档和生成SMIL文档,当然它会用到前面提到的二个Package里面的东西。还有如ImageModel,TextModel和RegionModel也都是基于SMIL标准的,比如它们分别 对应SMIL文档中的标签img, text和region。
当然,这都是具体的终端应用的实现,可能不同的应用会有不同的方式,但发送出去的和接收到的都应该是标准的Pdu,而SMIL文档仅是一个其中一个PduPart而已。

您可能感兴趣的文章:Android编程之非调用系统界面实现发送彩信的方法(MMS)Android开发中使用mms模块收发单卡和双卡短信的教程Android Mms之:短信发送流程(图文详解)Android Mms之:接收信息流程(图文详解)Android Mms之:草稿管理的应用Android Mms之:联系人管理的应用分析Android Mms之:深入理解对话列表管理Android Mms之:对话与联系人关联的总结详解Android Mms之:深入理解ComposeAndroid Mms之:PDU的使用详解简单掌握Android开发中彩信的发送接收及其附件的处理


免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Android Mms之:深入MMS支持

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Android Mms之:深入MMS支持

Composing and editingMMS在Android Mms应用里面的具体实现形式,或数据结构是SlideshowModel,它是一个每个节点为SlideModel的ArrayList,SlideModel是一个Model的Li
2022-06-06

Android Mms之:深入理解Compose

Mms中的ComposeMessageActivity(以下简称Composer)是整个Mms中最重要的一个组件,它负责编辑信息,发送信息,管理信息,接收信息,与外部应用接口。在Mms内部与Composer关联的类和组件特别多,几乎所有的类
2022-06-06

Android Mms之:深入理解对话列表管理

Conversation这个类主要表示对话的数据结构,其内持有一个Thread所有的相关信息,如Recipients,ThreadId等等,也用于管理Thread,比如查询Thread,删除Thread,更新Thread,管理ThreadI
2022-06-06

Android Mms之:草稿管理的应用

当编辑完一条信息后,如果在没有发送的情况下退出编辑页面,那么信息会自动保存为草稿。也就是在ComposeMessageActivity的onStop()时,如果还没有发送,那么就会调用WorkingMessage.saveDraft()来把
2022-06-06

Android Mms之:PDU的使用详解

Android当中的Mms对MMS(Multimedia Messaging Service)的操作关乎MMS协议部分都是通过Frameworks中提供的API来完成的:com.google.android.mms这个包在SDK中是不开放的
2022-06-06

Android Mms之:接收信息流程(图文详解)

信息的接收工作是由底层来完成的,当有一个 新的信息时底层完成接收后会以Intent的方式来通知上层应用,信息的相关内容也包含在Intent当中,Android所支持的信息Intent都定义在android.provider.Telephon
2022-06-06

Android Mms之:短信发送流程(图文详解)

信息的发送,对于Mms应用程序来讲主要就是在信息数据库中创建并维护一条信息记录,真正的发送过程交由底层(Frameworks层)函数来处理。 总体的来讲,当信息创建完成后,对于信息通常有三个去处,一个是放弃这个信息,也就是用户不想要此信息,
2022-06-06

Android Mms之:联系人管理的应用分析

Contact联系人对Mms来说是十分重要的,因为每一个对话的收信人都是一个联系人,新建信息时可以输入联系人的任何信息,比如号码或名字,Mms都可以把信息发给相应的人。Mms中的类Contact就是用来代表一个联系人,它含有联系人的信息,如
2022-06-06

Android Mms之:对话与联系人关联的总结详解

在Mms中每个Thread都有其相应的联系人,但是threads表中并没有直接保存联系人的信息(号码或名字),而是保存一个叫做recipient_id的东西,也还有一个类叫做data/RecipientIdCache.java专门管理它。在
2022-06-06

Android编程之非调用系统界面实现发送彩信的方法(MMS)

本文实例讲述了Android非调用系统界面实现发送彩信的方法。分享给大家供大家参考,具体如下: 一、问题: 最近有个需求,不去调用系统界面发送彩信功能。做过发送短信功能的同学可能第一反应是这样: 不使用 StartActivity,像发短信
2022-06-06

深入探讨:Golang是否支持宏定义?

Golang是否支持宏定义?Golang作为一种静态类型、并发支持、编译型的编程语言,其简洁的语法和高效的性能使其在互联网行业广受欢迎。然而,有些开发者可能会疑惑,Golang是否支持宏定义这一在一些其他编程语言中常见的特性呢?本文将深入
深入探讨:Golang是否支持宏定义?
2024-03-01

Android深入浅出之Binder机制

Android深入浅出之Binder机制 一 说明 Android系统最常见也是初学者最难搞明白的就是Binder了,很多很多的Service就是通过Binder机制来和客户端通讯交互的。所以搞明白Binder的话,在很大程度上就能理解程
2022-06-06

深入探究:鸿蒙对 Go 语言的支持程度

鸿蒙操作系统全面支持 go 语言,提供完整的 go 语言标准库、增强的并发性功能以及集成开发环境,便于开发者构建针对鸿蒙生态的应用程序。深入探究:鸿蒙对 Go 语言的支持程度鸿蒙,华为旗下的自主研发操作系统,支持多种编程语言,其中包括 G
深入探究:鸿蒙对 Go 语言的支持程度
2024-04-08

深入探讨Golang是否支持抽象类的设计

Golang是否支持抽象类的设计一直是一个备受讨论的话题。传统的面向对象语言如Java、C#等都提供了抽象类的概念,通过抽象类可以定义一些抽象方法和属性,要求子类实现或者重写这些方法,从而实现多态性和封装性。但是Golang作为一门静态类型
深入探讨Golang是否支持抽象类的设计
2024-03-13

Android笔记之:深入ViewStub的应用

在开发应用程序的时候,经常会遇到这样的情况,会在运行时动态根据条件来决定显示哪个View或某个布局。那么最通常的想法就是把可能用到的View都写在上面,先把它们的可见性都设为View.GONE,然后在代码中动态的更改它的可见性。这样的做法的
2022-06-06

GRPC是否仅支持Go语言?深入研究及分析

小伙伴们有没有觉得学习Golang很有意思?有意思就对了!今天就给大家带来《GRPC是否仅支持Go语言?深入研究及分析》,以下内容将会涉及到,若是在学习中对其中部分知识点有疑问,或许看了本文就能帮到你!GRPC 是否只支持 Go 语言?探究
GRPC是否仅支持Go语言?深入研究及分析
2024-04-04

Go语言的泛型编程支持不足的深入分析

缺乏泛型编程支持泛型编程是一种允许开发人员编写可用于不同类型数据的代码的编程范式。这可以使代码更灵活、更可重用,并且更容易维护。然而,Go语言目前不支持泛型编程。这使得在Go语言中编写某些类型的代码变得困难或不可能。例如,很难编写一个函
Go语言的泛型编程支持不足的深入分析
2024-02-01

编程热搜

  • Android:VolumeShaper
    VolumeShaper(支持版本改一下,minsdkversion:26,android8.0(api26)进一步学习对声音的编辑,可以让音频的声音有变化的播放 VolumeShaper.Configuration的三个参数 durati
    Android:VolumeShaper
  • Android崩溃异常捕获方法
    开发中最让人头疼的是应用突然爆炸,然后跳回到桌面。而且我们常常不知道这种状况会何时出现,在应用调试阶段还好,还可以通过调试工具的日志查看错误出现在哪里。但平时使用的时候给你闹崩溃,那你就欲哭无泪了。 那么今天主要讲一下如何去捕捉系统出现的U
    Android崩溃异常捕获方法
  • android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
    系统的设置–>电池–>使用情况中,统计的能耗的使用情况也是以power_profile.xml的value作为基础参数的1、我的手机中power_profile.xml的内容: HTC t328w代码如下:
    android开发教程之获取power_profile.xml文件的方法(android运行时能耗值)
  • Android SQLite数据库基本操作方法
    程序的最主要的功能在于对数据进行操作,通过对数据进行操作来实现某个功能。而数据库就是很重要的一个方面的,Android中内置了小巧轻便,功能却很强的一个数据库–SQLite数据库。那么就来看一下在Android程序中怎么去操作SQLite数
    Android SQLite数据库基本操作方法
  • ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
    工作的时候为了方便直接打开编辑文件,一些常用的软件或者文件我们会放在桌面,但是在ubuntu20.04下直接直接拖拽文件到桌面根本没有效果,在进入桌面后发现软件列表中的软件只能收藏到面板,无法复制到桌面使用,不知道为什么会这样,似乎并不是很
    ubuntu21.04怎么创建桌面快捷图标?ubuntu软件放到桌面的技巧
  • android获取当前手机号示例程序
    代码如下: public String getLocalNumber() { TelephonyManager tManager =
    android获取当前手机号示例程序
  • Android音视频开发(三)TextureView
    简介 TextureView与SurfaceView类似,可用于显示视频或OpenGL场景。 与SurfaceView的区别 SurfaceView不能使用变换和缩放等操作,不能叠加(Overlay)两个SurfaceView。 Textu
    Android音视频开发(三)TextureView
  • android获取屏幕高度和宽度的实现方法
    本文实例讲述了android获取屏幕高度和宽度的实现方法。分享给大家供大家参考。具体分析如下: 我们需要获取Android手机或Pad的屏幕的物理尺寸,以便于界面的设计或是其他功能的实现。下面就介绍讲一讲如何获取屏幕的物理尺寸 下面的代码即
    android获取屏幕高度和宽度的实现方法
  • Android自定义popupwindow实例代码
    先来看看效果图:一、布局
  • Android第一次实验
    一、实验原理 1.1实验目标 编程实现用户名与密码的存储与调用。 1.2实验要求 设计用户登录界面、登录成功界面、用户注册界面,用户注册时,将其用户名、密码保存到SharedPreference中,登录时输入用户名、密码,读取SharedP
    Android第一次实验

目录