MTK短信开发详解(六) 3.3 、【读取】短信 在待机屏按下[读取]键,向底层请求短信内容。阅读短信内容之后,按[返回]键,则退到收件箱。 [\plutommi\mmi\messages\messagessrc\SmsPsHandler.c] void mmi_msg_get_msg_new(void) { [...] mmi_msg_get_msg_req(MMI_FRM_SMS_APP_NOBOX, g_msg_cntx.msg_ind_index);// 发送读取短信内容的请求, 注意, 这里用的是NOBOX mmi_frm_sms_get_list_index(&type, &list_index, g_msg_cntx.msg_ind_index); [...] mmi_msg_exit_bizbox_list_dummy();↘ [\plutommi\mmi\Messages\MessagesSrc\MessagesMiscell.c] void mmi_msg_exit_inbox_list_dummy(void) currHistory.entryFuncPtr = mmi_msg_entry_inbox_list;//设置阅读新短信之后按“返回”键跳转到哪里。 g_msg_cntx.toDisplayMessageList = TO_DISPLAY_MESSAGE_LIST_INBOX;//设置显示页面
3.4、更新短信状态 读取请求发出之后,L4层已经把新短信状态改成已读, mmi_frm_sms_msg_box中的状态也应同步。 [\plutommi\mmi\MiscFramework\MiscFrameworkSrc\SMSCore.c] void mmi_frm_sms_read_sms(PsFuncPtrU16 callback, module_type mod_src, U16 type, U16 index, MMI_BOOL change_status) mmi_frm_sms_set_sms_status(type, index, MMI_FRM_SMS_INBOX);
[\plutommi\mmi\MiscFramework\MiscFrameworkSrc\SMSUtil.c] U8 mmi_frm_sms_set_sms_status(U16 type, U16 index, U16 newtype) { [...] switch (type) { [...] case MMI_FRM_SMS_INBOX: case MMI_FRM_SMS_UNREAD: msgindex = mmi_frm_sms_inbox_list[index]; mti = (mmi_frm_sms_msg_box[msgindex].msgtype & 0xf000); mmi_frm_sms_msg_box[msgindex].msgtype = mti | newtype;// 更改状态 break; […] }
3、短信箱 3.1、信箱初始化 开机时,系统逐条读取所有短信,保存到mmi_frm_sms_msg_box, 然后根据短信类型(未读/已读/已发送...)将索引添加到对应的 mmi_frm_sms_xxbox_list。 开机之后,收到新短信或者发送短信时选择了“发送并保存”,则短信会即时添加到mmi_frm_sms_msg_box和各自对应的 mmi_frm_sms_xxbox_list。
(1) void mmi_frm_sms_convert_mt_to_entry() (2) void mmi_frm_sms_convert_startup_read_to_entry()
3.2、信箱入口 以收件箱为例。入口函数并不直接生成列表,而是传递回调函数 mmi_msg_inbox_list_get_item给Categrory。 mmi_msg_pre_entry_inbox_list [\plutommi\mmi\Messages\MessagesSrc\SmsMoMtGuiInterface.c] void mmi_msg_entry_inbox_list(void) { [...] ShowCategory184Screen( STR_SCR6010_CAPTION, IMG_SMS_ENTRY_SCRN_CAPTION, STR_GLOBAL_OK, IMG_GLOBAL_OK, STR_GLOBAL_BACK, IMG_GLOBAL_BACK, numitem, mmi_msg_inbox_list_get_item, mmi_msg_inbox_list_get_hint, hiliteitem, guiBuffer); [...] }
[\plutommi\mmi\GUI\GUI_SRC\wgui_dynamic_menuitems.c] void load_dynamic_item_buffer(S32 n_items) { for (i = 0; i < n_items; i++) { if (dynamic_item_buffer.load_func(i, (UI_string_type) subMenuData, &image, 3)) // 调用mmi_msg_inbox_list_get_item [...] }
在mmi_msg_inbox_list_get_item函数,取方号码(或姓名)做信箱列表item标题,并判断短信的状态(已读/未读)。
[\plutommi\mmi\Messages\MessagesSrc\SmsMoMtGuiInterface.c] pBOOL mmi_msg_inbox_list_get_item(S32 item_index, UI_string_type str_buff, PU8 *img_buff_p, U8 str_img_mask) mmi_msg_inbox_list_get_item { […] AnsiiToUnicodeString(temp, (S8*) mmi_frm_sms_get_address(MMI_FRM_SMS_APP_INBOX , (U16) item_index)); //1 取发件方号码 name = lookUpNumber(temp);//2 取发件方姓名(如果电话本有记录) […] *img_buff_p = get_image(IMG_MESSAGE_UNREAD); //3 未读短信图标 […] *img_buff_p = get_image(IMG_MESSAGE_READ); //4 已读短信图标 […] }
3.3、阅读短信 以收件箱为例。阅读短信时,并不是直接从全局数组 mmi_frm_sms_msg_box 读取,而是通过发送PRT_MSG_ID_MMI_SMS_GET_MSG_REQ获得短信,读取之后,短信的未读状态变为已读。 [\plutommi\mmi\Messages\MessagesSrc\SmsMoMtGuiInterface.c] void mmi_msg_entry_inbox_list(void) SetLeftSoftkeyFunction(mmi_msg_get_msg_inbox, KEY_EVENT_UP);// 设置左软件
[\plutommi\mmi\Messages\MessagesSrc\SmsPsHandler.c] void mmi_msg_get_msg_inbox(void) g_msg_cntx.toDisplayMessageList = TO_DISPLAY_MESSAGE_LIST_INBOX; mmi_msg_get_msg_req(MMI_FRM_SMS_APP_INBOX, (U16) g_msg_cntx.currBoxIndex);// 请求的是 MMI_FRM_SMS_APP_INBOX 短信
[\plutommi\mmi\Messages\MessagesSrc\SmsPsHandler.c] void mmi_msg_get_msg_req(U16 type, U16 index) mmi_frm_sms_read_sms(mmi_msg_get_msg_rsp, MOD_MMI, type, index, MMI_TRUE);
[\plutommi\mmi\MiscFramework\MiscFrameworkSrc\SMSCore.c] void mmi_frm_sms_read_sms(PsFuncPtrU16 callback, module_type mod_src, U16 type, U16 index, MMI_BOOL change_status) { mmi_frm_sms_get_sms_index((mmi_frm_sms_msgbox_enum) type, index, data); // 根据信箱类型,取得L4index。 [...] mmi_frm_sms_set_sms_status(type, index, MMI_FRM_SMS_INBOX);// 同步更改mmi_frm_sms_msg_box 短信状态, 底层短信状态在发送读取请求时更改。 [...] mmi_frm_sms_write_action(callback, mod_src, data, mmi_frm_sms_read_sms_req);// 提交读取短信请求 }
[\plutommi\mmi\MiscFramework\MiscFrameworkSrc\SMSMsg.c] void mmi_frm_sms_read_sms_req(void *inMsg) mmi_frm_sms_read_sms_seg();
[\plutommi\mmi\MiscFramework\MiscFrameworkSrc\SMSMsg.c] U8 mmi_frm_sms_read_sms_seg(void) SetProtocolEventHandler(mmi_frm_sms_read_sms_rsp, PRT_MSG_ID_MMI_SMS_GET_MSG_RSP); mmi_frm_sms_send_message(MOD_MMI, MOD_L4C, 0, PRT_MSG_ID_MMI_SMS_GET_MSG_REQ, (oslParaType*) msgReq, NULL); 完整版本请见 http://www.51qianru.cn/bbs/ 曙海教育
曙海嵌入式学院3G通信培训中心
(MTK培训,Android培训,iPhone培训)
电话:021-51875830
网址:http://www.51qianru.cn
讲师:李现路
版权所有-曙海教育 转发请注明出处
|