6572_message_MWI (Message Waiting Information)

6572_message_MWI 

 

1. 
前言

1.1 目的

    本文介绍了一个mwi的接收过程,主要关注的是消息从modem上报到APP的主要处理流程。实际在总结的时候,先讲RIL层是如何处理mwi的消息的,并如何处理并传递给framework的,再一步步分析,framework里事件是如何传送到app的,APP是怎么收到事件并显示的。

 

文档注重事件流程,描述了事件是在软件分层的框架里的流向,并重点分析一些重点类的实例是如何创建并能为相应模块使用的。

 

希望本文能够对入手本模块的同事有帮助作用,并起到一个抛砖引玉的作用。

 

 

2. 增加MWI接收的流程分析

2.1 对RIL数据解析的修改

在\frameworks\opt\telephony\src\java\com\android\internal\telephony\gsm\SmsMessage.java类里面,在方法parseUserData里对数据进行解析时,根据3GPP TS 23.038 V7.0.0等相关协议,根据dataCodingScheme对消息类型进行判断,下面蓝色的地方是存在问题而修改的代码,原代码不能正确识别到mwi,导致Mwi消息从这里开始便不能被正确传递到app。

 

 else if ((dataCodingScheme & 0xF0) == 0xC0

                || (dataCodingScheme & 0xF0) == 0xD0

                || (dataCodingScheme & 0xF0) == 0xE0) {

                       。。。

 

            userDataCompressed = false;

            boolean active = ((dataCodingScheme & 0x08) == 0x08);

 

            // bit 0x04 reserved

 

            

/*

if ((dataCodingScheme & 0x03) == 0x00) {

                isMwi = true;

                mwiSense = active;

                mwiDontStore = ((dataCodingScheme & 0xF0) == 0xC0);

            } else {

                isMwi = false;

 

                Log.w(LOG_TAG, "MWI for fax, email, or other "

                        + (dataCodingScheme & 0xff));

            }

*/

isMwi = true;

            mwiSense = active;

            mwiDontStore = ((dataCodingScheme & 0xF0) == 0xC0);

            

            if ((dataCodingScheme & 0x07) == 0x07) {

                mwiType = 0x07;

                Log.d(LOG_TAG, "[cc vedio type]");

            } else {

                mwiType = (int) (dataCodingScheme & 0x03);

            }

             mwiCount = 1;

。。。

        }

 

 

 if (hasUserDataHeader/* && ((dataCodingScheme & 0x03) == 0x00)*/) {

            if (this.userDataHeader.getMwiElements().size() != 0) {

                MessageWaitingIndication mwi = this.userDataHeader.getMwiElements().get(0);

                isMwi = true;

                mwiSense = mwi.getMwiCount() > 0 ? true : false;

                mwiDontStore = mwiDontStore && mwi.isMwiDontStore();

                mwiType = mwi.getMwiType();

                mwiCount = mwi.getMwiCount();

              }

        }

 

2.2 对消息接收流程的修改 

 

 

在GsmSMSDispatcher 的dispatchMessage会对收到的message做区分处理,mwi会在这里被分离出来,处理代码如下,蓝色的部分是新增加的处理,可以看出如果是mwi类型的消息,会调用setVoiceMessageWaitingExtension方法,之后便返回,不再走正常短信的流程。至于mwi是如何处理的,可看setVoiceMessageWaitingExtension的处理流程,它是根据相关协议完成数据的存储和显示的。

        boolean isMWISetMessage = sms.isMWISetMessage();

         

        if (sms.isMWISetMessage()) {

                mPhone.setVoiceMessageWaitingExtension(1, sms.getMwiCount(), sms.getMwiType());

            

            handled = sms.isMwiDontStore();

            if (Config.DEBUG) {

                Log.d(TAG, "Received voice mail indicator set SMS shouldStore=" + !handled);

            }

        } else if (sms.isMWIClearMessage()) {

            //mPhone.setVoiceMessageWaiting(1, 0);             

          Log.i(TAG, "Clear_MwiType: " + sms.getMwiType());

        mPhone.setVoiceMessageWaitingExtension(1, 0, sms.getMwiType());

            handled = sms.isMwiDontStore();

            if (Config.DEBUG) {

                Log.d(TAG, "Received voice mail indicator clear SMS shouldStore=" + !handled);

            }

 

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值