WM中,从ril.h及文档可以发现,ril支持两大类短信,GSM0340和IS637(CDMA)。
关于开机需要读取的短信都在sim卡中,有两种,一种为模块初始化过程中收到的短信,由于不能上报,会存入sim卡中;另一种是sim卡中事先比如用户手动存入的短信。
RIL中对这两种短信要分别处理,tmail对这两种短信也有加以区分。
一、初始化过程中收到的短信:
1、RIL初始化时,应从sim卡从读取这类短信上报,界面显示方式与正常收到短信的提示一致。
在RIL进入radio on的过程中,选择合适的位置发送CMGL命令来获取sim卡中短信信息,其中UNREAD类型是我们想要的。在parse函数中解析CMGL的reponse上报,等待tmail的一系列后续调用。
2、tmail收到CMGL的信息后,CMGR将出马,由于事先知道短信所在index,有的放矢地读取sim卡中的短信。解析好短信,放入相应的结构体。
3、sms_provider,CMGL和普通收到短信一样,会调用sms_provider做一些短信类型识别、格式转换的工作。对于is637,provider应该添加对unicode的支持。
4、此后RIL_DeleteMsg 会被调用来删除这些暂存在sim卡的短信。
二、sim卡已有短信的读取。(应在CMGL之后进行,防止第一种短信未被删除)
1、开机过程中,sim卡联系人读取结束后,RIL_GetMsgServiceOptions
会被调用,获取sim卡的存储状态。当read区域不为空,将开始sim卡联系人的读取。
2、RIL_ReadMsg 被调用,ril解析短信填入结构体。
3、一个很大的不同,sim卡短信不会调用provider进行处理,而且上报后,界面并不会提示收到新短信,而是仅仅在收件箱中显示,并且用不同于普通短信的图标来显示sim卡短信。
三、当系统是IS637时的疑惑。
即读取sim卡已有短信,如果是填入msgIS637InDeliver结构体,并且Message types是使用RIL_MSGTYPE_IN_IS637DELIVER,界面上不会显示短信,使用RIL_MSGTYPE_IN_DELIVER,竟成功显示,这点十分令人困惑,同样相反的操作CMGW,传入ril的Message types是RIL_MSGTYPE_IN_DELIVER,而非期待的RIL_MSGTYPE_IN_IS637DELIVER。而对于cmgl和接收短信,使用msgInDeliver结构体没有问题。这个问题还需要分析。
同时网上看到一位很帅的哥们,好像也遇到了和我同样的问题,他的一句话大概也印证了我得猜测:
“接收的未读短信或已读短信
调用ParseDeliverMessageTextGSM函数进行解析。
解析过程基本与新短信上报解析相同,只是上报消息类型不同,而解析结果存放的结构体也不同
”