`

MMS接收流程

 
阅读更多

 

彩信的接收过程与短信略有不同,它主要是由应用程序负责从彩信服务中心(MMSC Multimedia Messaging Service Center)下载彩信信息。大致的流程是Frameworks会先发出一条短信,告知应用程序有一个彩信,短信中含有一些信息比如过期日期,发送者手机号码,彩信的URL等,然后应用程序自行通过HTTP取回URL所指的彩信内容。具体的流程为:

Telephony Frameworks会先发出一个Intent:android.provider.Telephony.Intents.WAP_PUSH_RECEIVED_ACTION=”android.provider.Telephony.WAP_PUSH_RECEIVED”告知上层应用有一个彩信来了。这个Intent中会含有一个”data”byte数组(通过byte[] data = intent.getByteArrayExtra(“data”)来获取),这个Byte数组是关于这个彩信的一些信息的描述,它是一个NotificationInd,里面含有彩信的一些信息,比如发送者手机号码,彩信的ContentLocation(URL)。之后是由应用程序来决定如何做下一步的处理。

在Mms中是由transaction.PushReceiver.java来接收WAP_PUSH_RECEIVED_ACTION,接收到彩信通知Intent后,它会做一些预处理,把data字段取出来,用Pdu的工具解析成为GenericPdu,然后转化为NotificationInd,并把它写入数据库,然后会启动TransactionService来做进一步的NOTIFICATION_TRANSACTION处理,同时把这个NotificationInd的Uri也传过去。

TransactionService被唤起,在其onStartCommand中会处理一下把PushReceiver所传来的Intent放入自己的MessageQueue中,然后在Handler.handleMessage()中处理TRANSACTION_REQUEST时处理NOTIFICATION_TRANSACTION。先是加载默认的一些彩信相关的配置信息,主要是MMSC,Proxy和Port,这些都是与运营商相关的信息,可以通过APN的设置来更改。TransactionService用PushReciver传来的NotificationInd的Uri和加载的配置信息TransactionSettings构建一个NotificationTransaction对象。之后,TransactionService检查其内的二个队列,或是加入Pending队列,或是直接处理(加入到正在处理队列),处理也是直接调用NotificationTransaction.process()。

NotificationTransaction的process()方法是继承自父类Transaction的方法,它只是简单的开启一个新的线程,然后返回,这样就可以让Service去处理其他的Transaction Request了。

在线程中,首先从DownloadManager和TelephonyManager中加载一些配置信息,是否彩信设置为自动获取(auto retrieve),以及Telephony是否设置为数据延迟(DATA_SUSPEND),然后会采取不同的措施,再从NotificationInd中取出彩信的过期日期。如果配置为不取数据(更确切的说,是不现在取数据),那么就先给DownloadManager的状态标记为STATE_UNSTARTED,再给MMSC发送一个Notify Response Indication,之后结束处理,函数返回,彩信的通知处理流程到此为止。用户可以通过操作UI,用其他方法手动下载彩信,这个会在后面详细讨论。

如果设置为自动获取或者数据传输是畅通的,那么就把DownloadManager状态标记为START_DOWNLOADING并开始下载彩信数据。彩信的获取是通过HTTP到彩信的ContentLocation(URL)取得数据。先是调用父类方法getPdu(),传入彩信的URL,最终调用HttpUtils的httpConnection方法发送HTTP GET请求,MMSC会把彩信数据返回,作为getPdu()的返回值返回。拿到的是一个byte数组,需要用Pdu的工具解析成为GenericPdu,然后用PduPersister把其写入数据库,再把彩信的大小更新到数据库,到这里一个彩信的接收就算完成了。剩下的就是,因为已经获得了彩信的数据,所以要把先前的通知信息(NotificationInd)删除掉,然后更新一下相关的状态,给MMSC返回Notify Response Indication,结束处理。因为数据库已经有所改变,所以UI会收到ContentChanged事件,刷新UI列表,新信息就会显示出来。


如前所述,如果彩信配置设置为不自动获取,那么UI刷新了后就会显示彩信通知:到期日期,彩信大小等,并提供一个”Download”按扭。用户可以点击按扭来下载彩信内容,点击按扭后,会启动TransactionService,把彩信通知的Uri,和RETRIEVE_TRANSACTION request打包进一个Intent传给TransactionService。TransactionService,像处理其他的Transaction一样,都是放进自己的MessageQueue,然后加载默认的TransactionSettings,构建RetrieveTransaction对象,然后处理调用RetrieveTransaction.process()。

RetrieveTransaction也是继承自Transaction,其process()也是创建一个线程,然后返回。在线程中,首先它用Pdu工具根据Uri从数据库中加载出彩信通知(NotificationInd),从NotificationInd中取得彩信的过期日期,检查过期日期,如果彩信已经过期,那么给MMSC发送Notify Response Indication。把DownloadManager状态标记为开始下载,然后如果彩信已过期,标记Transaction状态为Failed,然后返回,结束处理流程。如果一切正常,会用getPdu()从彩信的ContentLocation(URL)上面获取彩信内容,它会用HttpUtils.httpConnection()通过HTTP来获取,返回一个byte数组。用Pdu工具解析byte数组,得到GenericPdu,检查一下是否是新信息,是否是重复的信息,如果重复,标记状为失败,然后返回,结束处理。如果是新信息,先把GenericPdu用PduPersister写入数据库中,更新信息大小和ContentLocation(URL)到数据库中,到这里一个彩信其实已经全部获取完了。接下来就是发送收到确认信息给MMSC,标记处理状态为成功,结束处理。这时UI应该监听到数据库变化,并刷新,新信息应该会显示给用户。


总结,与信息发送类似,数据库在接收信息过程中也扮演了重要角色,信息接收到后进行解析,然后就写入数据库,与发送不同,接收的信息没有那么多状态,一旦写入了数据库就意味着信息接收已经成功,UI也是只监听数据库的变化,一旦有变化立刻刷新显示信息。

来源:http://blog.csdn.net/hitlion2008/article/details/7166075

分享到:
评论

相关推荐

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

    本篇文章是对Android中的接收信息流程进行了详细的分析介绍,需要的朋友参考下

    MMS发送接收流程与Android实现

    MMS发送接收流程协议分析,以及在Android中的相关实现

    MMS彩信业务流程及代码实现

    MMS彩信业务流程及代码实现,业务流程,彩信的接收

    彩信收发流程分析方法说明

    mms 彩信收发流程分析方法说明 收发流程及错误原因分析

    Android Mms之:深入理解Compose

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

    新建 Microsoft PowerPoint 演示文稿.pptx

    Mms模块数据库分析以及短信彩信发送接收大概的流程。自己总结的。

    MM7协议彩信网关

    用特定的编辑软件,如索爱提供的MMS Composer 制作出相应的彩信内容, 彩信内容包括彩信所需要的图片,铃声,文本信息,以及彩信的解释文件smil 文件; 2. 将制作好的彩信内容保存到彩信服务器的磁盘驱动...

    WCDMA精品原理教材

    2.3.3 MMS业务 2-9 第3章 WCDMA系统结构 3-1 3.1 概述 3-1 3.1.1 UMTS系统网络构成 3-1 3.2 UTRAN的基本结构 3-4 3.2.1 系统接口 3-4 3.2.2 UTRAN各接口的基本协议结构 3-5 3.2.3 UTRAN完成的功能 3-7 3.2.4 RNC...

    智能手机操作系统编程Symbian及60系列

    本书旨在把目前市场上最流行的也是持有最大市场分额的智能手机操作系统Symbian介绍给更广泛的人群。本忆较全面地覆盖了Symbian操作系统及编程等... 8.4.3 Email发送和接收的基本原理  8.4.4 Email简单实例  8.5 小结

    美河提供.智能手机操作系统编程Symbian及60系列1

    本书旨在把目前市场上最流行的也是持有最大市场分额的智能手机操作系统Symbian介绍给更广泛的人群。本忆较全面地覆盖了Symbian操作系统及编程等... 8.4.3 Email发送和接收的基本原理  8.4.4 Email简单实例  8.5 小结

    流媒体基本知识及流媒体服务器搭建知识大全

    2.1 MMS协议简介 15 2.2 RTP相关协议简介 15 2.2.1 RTP与RTCP协议简介 15 2.2.2 RTSP协议简介 16 2.2.3 流传输过程 17 2.3 RTMP vs RTMFP 18 2.3.1 RTMP协议简介 18 2.3.3 RTMFP 简介 19 2.3.4 RTMP VS RTMFP 20 2.4...

    mysms - SMS/Text from Computer-crx插件

    ●使用mysms,可以在计算机上快速便捷地发送和接收SMS以及MMS。 您可以使用完整的计算机键盘输入消息,在消息中添加图片和文件,然后将其发送给任何电话联系人。 ●当手机处于静音状态或放在口袋中时,您不会错过...

    3G的标准与原理相关资料

    41. 接收机底噪、接收机增益、接收灵敏度、移动台的热噪声功率 36 42. GOS、RSSI、Eb/No、Eb/Io的概念 37 43. db、dBi、dBm分别是什么单位,有何区别? 37 44. 基站侧信号处理,比如交织、复用后同原来相比什么区别 ...

    JAVA上百实例源码以及开源项目

    6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...

    JAVA上百实例源码以及开源项目源代码

    6个目标文件,EJB来模拟银行ATM机的流程及操作:获取系统属性,初始化JNDI,取得Home对象的引用,创建EJB对象,并将当前的计数器初始化,调用每一个EJB对象的count()方法,保证Bean正常被激活和钝化,EJB对象是用...

    精易模块[源码] V5.15

    3、优化“系统_创建桌面快捷方式”流程代码,感谢易友[ds9660]反馈。 4、修正“IP_10进制转IP”与“IP_16进制转IP”命令反向的问题,感谢易友[@humanbean ]反馈。 5、改善“网页_访问”死循环代码,感谢易友[@...

Global site tag (gtag.js) - Google Analytics