转载请保持原文的完整性并注明原文出处!
在网上找了很久,没有找到MMS的发送示例代码,好不容易找来的一个,还是一堆的乱七八糟的代码,看的头晕。后来自己认真的研究了一天,发现MTK下发送彩信所涉及的两个主要的关键函数为:"srv_mms_create" 和 “srv_mms_send” ,其流程为先调用create函数创建一个MMS并返回一个msd_id,然后在send函数中根据这个msg_id来将彩信发送出去。
其实这个msg_id是create函数的回调反馈出来的,那么如何create一个MMS并获得这个msg_id呢?这个是最关键的。我们观察到create函数的唯一的一个参数是一个“srv_mms_create_req_struct”类型的结构体,这个结构体里面有个成员为“xml_filepath”,是的,这个XML文件才是描述这条彩信的是最最关键的东西。所以,我们要做的就是如果构造这个个XML文件,其他的任何东西,基本都是遮眼浮云,唯有XML才是真理。
那么,如何创建这个XML文件呢?不知道有不有朋友从MMI入口开始跟踪过MMS的创建流程,其实那些界面都是为了构造XML而作准备的,你一路跟踪下去,肯定会跟踪到“mmi_uc_create_mms_handler”这个函数,这个时候,你才会发现创建XML的函数是“srv_uc_create_mms_xml_description_file”,好了,到了这里,进入这个函数稍微看一看,所有的一切都基本明了了,接下来,我们就是需要知道这个XML文件具体是怎么构建出来的。
好吧,至此,函数“srv_uc_create_mms_xml_description_file”里面的内容,你自己去看了,其实就是描述了这条彩信的各种基本信息,比如说是发送给谁啊,抄送给谁啊,是否需要发送阅读报告啊,是否隐藏发信人啊,发送的优先级啊,标题是什么啊,文字/图片/视频/音频的文件名和文件绝对路径啊,附件的名字和绝对路径啊,他们分了多少个slide啊,每个slide里面是怎么布局的啊等等,就这些内容。这里我暂时贴一段简单的XML文件,建议你先结合彩信,仔细观察下这个XML文件。如果想看更加复杂的,就自己在模拟器上手动编辑一个MMS,然后在“srv_uc_create_mms_xml_description_file”函数加个断点,在“srv_uc_create_mms_xml_description_file”的最后加段自己的复制XML文件到指定地方那个的代码,点击发送,就会进入到“srv_uc_create_mms_xml_description_file”里面了,然后就可以自己慢慢研究了。
<mms> <header> <to type="P">13480121234</to> <rr>1</rr> <dr>0</dr> <prio>2</prio> <expiry>0</expiry> <delivery>0</delivery> <visible>1</visible> </header> <body bgColor="0xffffff" fgColor="0x000000" slideNum="4" objNum="2" layout="1" imgFit="1" txtFit="2"> <slide index="1" dur="5"> <img id="1" begin="0" end="5"/> </slide> <slide index="2" dur="5"> <img id="2" begin="0" end="5"/> </slide> <slide index="3" dur="5"> <img id="1" begin="0" end="5"/> </slide> <slide index="4" dur="5"> <img id="2" begin="0" end="5"/> </slide> <obj id="1" attach="0" vf="0" drm="0" size="33130" offset="0" encoding="0"> <name>201101010000000E7313.jpg</name> <filepath>E:\Photos\201101010000000E7313.jpg</filepath> </obj> <obj id="2" attach="0" vf="0" drm="0" size="32099" offset="0" encoding="0"> <name>20110101000300282986.jpg</name> <filepath>E:\Photos\20110101000300282986.jpg</filepath> </obj> </body> </mms>
看完上面的代码了,我们就要自己手动构造一个XML文件了。好吧,不说多了,下面,请看代码,再做解释。
#if 1//MMS 发送示例 //转载请保持原文的完整性并注明原文出处!
/***************************************************************************** * FUNCTION * srv_uc_create_xml_element_start * DESCRIPTION * Create the xml start element * PARAMETERS * fh [IN] * element_name [?] * attr_list [IN] * RETURNS * void *****************************************************************************/ extern S32 srv_uc_create_xml_element_start(FS_HANDLE fh,U8 *element_name,U8 **attr_list); /***************************************************************************** * FUNCTION * srv_uc_create_xml_element_end * DESCRIPTION * Create the xml end element * PARAMETERS * fh [IN] * element_name [?] * RETURNS * void *****************************************************************************/ extern S32 srv_uc_create_xml_element_end(FS_HANDLE fh,U8 *element_name); /***************************************************************************** * FUNCTION * srv_uc_create_xml_new_line * DESCRIPTION * Insert new line * PARAMETERS * fh [IN] * RETURNS * void *****************************************************************************/ extern S32 srv_uc_create_xml_new_line(FS_HANDLE fh); /***************************************************************************** * FUNCTION * srv_uc_create_xml_data * DESCRIPTION * Add data * PARAMETERS * fh [IN] * data [?] * RETURNS * void *****************************************************************************/ extern S32 srv_uc_create_xml_data(FS_HANDLE fh,U8 *data); /***************************************************************************** * FUNCTION * srv_uc_create_xml_data_numeric_to_char * DESCRIPTION * Add numeric data * PARAMETERS * fh [IN] * value [IN] * RETURNS * void *****************************************************************************/ extern S32 srv_uc_create_xml_data_numeric_to_char(FS_HANDLE fh,U32 value); /***************************************************************************** * FUNCTION * srv_uc_create_xml_element_single * DESCRIPTION * Create the xml single element * PARAMETERS * fh [IN] * element_name [?] * attr_list [IN] * RETURNS * void *****************************************************************************/ extern S32 srv_uc_create_xml_element_single(FS_HANDLE fh,U8 **attr_list); /******************************************************************************* ** 函数: MsgCmd_GetUsableDrive ** 功能: 获取系统可用的存储设备盘符 ** 参数: ** 返回: 返回盘符 0x43~0x47 ** 作者: wasfayu *******/ S32 MsgCmd_GetUsableDrive(void); #define MSGCMD_FILE_PATH_LENGTH 127 #define MSGCMD_FILE_NAME_LENGTH 63 #define mc_trace(fmt,...) kal_prompt_trace(0,fmt,##__VA_ARGS__) /* 自定义彩信发送请求结构 */ typedef struct { char sendto[MMI_PHB_NUMBER_LENGTH+1]; WCHAR xmlpath[MSGCMD_FILE_PATH_LENGTH+1]; WCHAR subject[SRV_UC_MAX_SUBJECT_LEN+1]; WCHAR picname[MSGCMD_FILE_NAME_LENGTH+1]; WCHAR picpath[MSGCMD_FILE_PATH_LENGTH+1]; U8 priority; /* mma_priority_enum */ U8 expiry_time; /* srv_uc_expiry_time_enum */ U8 delivery_time; /* srv_uc_delivery_time_enum */ BOOL read_report; /* Read report flag */ BOOL delivery_report; /* Delivery report flag */ BOOL hide_sender; /* Hide sender flag */ }MsgCmdMMSXmlData; typedef struct { WCHAR xmlpath[MSGCMD_FILE_PATH_LENGTH+1]; mma_sim_id_enum sim; }MsgCmdMMSUserData; typedef struct { LOCAL_PARA_HDR char sendto[MMI_PHB_NUMBER_LENGTH+1]; WCHAR subject[SRV_UC_MAX_SUBJECT_LEN+1]; WCHAR picpath[MSGCMD_FILE_PATH_LENGTH+1]; WCHAR *picname; //这个指针其实就是指向picpath里面的某个元素 mma_sim_id_enum sim; }MsgCmdMMSReq; /* wap_mma_set_profile_req_struct srv_nw_usab_is_any_network_available srv_ucm_is_any_call [srv_uc_create_mms_xml_description_file] */ /******************************************************************************* ** 函数: msgcmd_CreateMMSXMLFile ** 功能: 创建MMS发送时需要的XML文件 ** 入参: MsgCmdMMSXmlData -- 创建XML文件的依据 ** 返回: 是否成功 ** 说明: 调用srv_uc_create_mms_xml_description_file函数中类似的功能来完成布局 ** 作者: wasfayu *******/ static MMI_BOOL msgcmd_CreateMMSXMLFile(MsgCmdMMSXmlData *param) { #define FUNC_FAIL_RETURN(exp) if ((exp) < FS_NO_ERROR) { FS_Close(fh); return MMI_FALSE;} #define MMS_BACKGROUND_COLOR 0xFFFFFF #define MMS_FOREGROUND_COLOR 0x000000 FS_HANDLE fh; if (NULL == param) return MMI_FALSE; if (0 == strlen(param->sendto)) return MMI_FALSE; if (0 == app_ucs2_strlen((const kal_int8 *)param->xmlpath)) return MMI_FALSE; if (0 == app_ucs2_strlen((const kal_int8 *)param->picname)) return MMI_FALSE; if (0 == app_ucs2_strlen((const kal_int8 *)param->picpath)) return MMI_FALSE; // ready,go! if ((fh = FS_Open(param->xmlpath,FS_READ_WRITE|FS_CREATE_ALWAYS)) < FS_NO_ERROR) return MMI_FALSE; /* <mms> */ FUNC_FAIL_RETURN(srv_uc_create_xml_element_start(fh,(U8*) SRV_UC_XML_ELEMENT_MMS,NULL)); FUNC_FAIL_RETURN(srv_uc_create_xml_new_line(fh)); /* <header> */ FUNC_FAIL_RETURN(srv_uc_create_xml_element_start(fh,(U8*) SRV_UC_XML_ELEMENT_HEADER,NULL)); FUNC_FAIL_RETURN(srv_uc_create_xml_new_line(fh)); /* To address */ if (MMI_TRUE) { U8 *attr_list[3] = {SRV_UC_XML_ATTR_TYPE,SRV_UC_XML_ATTR_POHNE_NUMBER,NULL}; FUNC_FAIL_RETURN(srv_uc_create_xml_element_start(fh,SRV_UC_XML_ELEMENT_TO,attr_list)); FUNC_FAIL_RETURN(srv_uc_create_xml_data(fh,(U8*)param->sendto)); FUNC_FAIL_RETURN(srv_uc_create_xml_element_end(fh,SRV_UC_XML_ELEMENT_TO)); FUNC_FAIL_RETURN(srv_uc_create_xml_new_line(fh)); } /* subject */ if (mmi_ucs2strlen((S8*)param->subject)) { FUNC_FAIL_RETURN(srv_uc_create_xml_element_start(fh,(U8*) SRV_UC_XML_ELEMENT_SUBJECT,NULL)); FUNC_FAIL_RETURN(srv_uc_create_xml_data_usc2_to_utf8_to_base64(fh,(U8*)param->subject)); FUNC_FAIL_RETURN(srv_uc_create_xml_element_end(fh,(U8*) SRV_UC_XML_ELEMENT_SUBJECT)); FUNC_FAIL_RETURN(srv_uc_create_xml_new_line(fh)); } /* Read Report */ FUNC_FAIL_RETURN(srv_uc_create_xml_element_start(fh,(U8*) SRV_UC_XML_ELEMENT_READ_REPORT,NULL)); FUNC_FAIL_RETURN(srv_uc_create_xml_data_numeric_to_char(fh,param->read_report)); FUNC_FAIL_RETURN(srv_uc_create_xml_element_end(fh,(U8*) SRV_UC_XML_ELEMENT_READ_REPORT)); FUNC_FAIL_RETURN(srv_uc_create_xml_new_line(fh)); /* Delivery Report */ FUNC_FAIL_RETURN(srv_uc_create_xml_element_start(fh,(U8*) SRV_UC_XML_ELEMENT_DELIVERY_REPORT,param->delivery_report)); FUNC_FAIL_RETURN(srv_uc_create_xml_element_end(fh,(U8*) SRV_UC_XML_ELEMENT_DELIVERY_REPORT)); FUNC_FAIL_RETURN(srv_uc_create_xml_new_line(fh)); /* Priority */ FUNC_FAIL_RETURN(srv_uc_create_xml_element_start(fh,(U8*) SRV_UC_XML_ELEMENT_PRIORITY,param->priority)); FUNC_FAIL_RETURN(srv_uc_create_xml_element_end(fh,(U8*) SRV_UC_XML_ELEMENT_PRIORITY)); FUNC_FAIL_RETURN(srv_uc_create_xml_new_line(fh)); /* Expiry time */ FUNC_FAIL_RETURN(srv_uc_create_xml_element_start(fh,(U8*) SRV_UC_XML_ELEMENT_EXPIRY,srv_uc_convert_to_mms_expiry_time(param->expiry_time))); FUNC_FAIL_RETURN(srv_uc_create_xml_element_end(fh,(U8*) SRV_UC_XML_ELEMENT_EXPIRY)); FUNC_FAIL_RETURN(srv_uc_create_xml_new_line(fh)); /* Delivery time */ FUNC_FAIL_RETURN(srv_uc_create_xml_element_start(fh,(U8*) SRV_UC_XML_ELEMENT_DELIVERY_TIME,srv_uc_convert_to_mms_delivery_time(param->delivery_time))); FUNC_FAIL_RETURN(srv_uc_create_xml_element_end(fh,(U8*) SRV_UC_XML_ELEMENT_DELIVERY_TIME)); FUNC_FAIL_RETURN(srv_uc_create_xml_new_line(fh)); /* Sender visibility */ FUNC_FAIL_RETURN(srv_uc_create_xml_element_start(fh,(U8*) SRV_UC_XML_ELEMENT_VISIBLE,!param->hide_sender)); FUNC_FAIL_RETURN(srv_uc_create_xml_element_end(fh,(U8*) SRV_UC_XML_ELEMENT_VISIBLE)); FUNC_FAIL_RETURN(srv_uc_create_xml_new_line(fh)); /* </header> */ FUNC_FAIL_RETURN(srv_uc_create_xml_element_end(fh,(U8*) SRV_UC_XML_ELEMENT_HEADER)); FUNC_FAIL_RETURN(srv_uc_create_xml_new_line(fh)); if (MMI_TRUE) { U16 str_len = SRV_UC_XML_STR_LEN; /* size of slide_num,obj_num,layout,bg_color and fg_color */ U16 attr_num = 7; /* size of arrt_list would be attr_num * 2 + 1 */ U8 bg_color[SRV_UC_XML_STR_LEN]; U8 fg_color[SRV_UC_XML_STR_LEN]; U8 slide_num[SRV_UC_XML_STR_LEN]; U8 obj_num[SRV_UC_XML_STR_LEN]; U8 layout[SRV_UC_XML_STR_LEN]; U8 txt_fit[SRV_UC_XML_STR_LEN]; U8 img_fit[SRV_UC_XML_STR_LEN]; U8 *attr_list[7 * 2 + 1]; /* 7= bg_color....img_fit */ U8 i = 0; /* body */ i = 0; /*-----background color-----------------------------------------------*/ memset(bg_color,str_len); sprintf((char*)bg_color,"0x%06x",MMS_BACKGROUND_COLOR); attr_list[i++] = (U8*) SRV_UC_XML_ATTR_BGCOLOR; attr_list[i++] = bg_color; /*-----foregrount color----------------------------------------------*/ memset(fg_color,str_len); sprintf((char*)fg_color,MMS_FOREGROUND_COLOR); attr_list[i++] = (U8*) SRV_UC_XML_ATTR_FGCOLOR; attr_list[i++] = fg_color; /*-----slide number---------------------------------------------------*/ memset(slide_num,str_len); slide_num[0] = '1'; //只有一个slide attr_list[i++] = (U8*) SRV_UC_XML_ATTR_SLIDE_NUM; attr_list[i++] = slide_num; /*-----object number--------------------------------------------------*/ memset(obj_num,str_len); obj_num[0] = '1'; //只有一个object attr_list[i++] = (U8*) SRV_UC_XML_ATTR_OBJ_NUM; attr_list[i++] = obj_num; /*-----layout type----------------------------------------------------*/ memset(layout,str_len); layout[0] = '1'; //布局,参见mma_slide_layout_enum attr_list[i++] = (U8*) SRV_UC_XML_ATTR_LAYOUT; attr_list[i++] = layout; /*-----image fit------------------------------------------------------*/ memset(img_fit,str_len); sprintf((char*)img_fit,"%d",MMA_REGION_FIT_MEET); /* Always set to MEET for img,because current mms can not support other type */ attr_list[i++] = (U8*) SRV_UC_XML_ATTR_IMGFIT; attr_list[i++] = img_fit; /*-----text fit-------------------------------------------------------*/ memset(txt_fit,str_len); sprintf((char*)txt_fit,MMA_REGION_FIT_SCROLL); /* Always set to SCROLL for text,because current mms can not support other type */ attr_list[i++] = (U8*) SRV_UC_XML_ATTR_TXTFIT; attr_list[i++] = txt_fit; /*--------------------------------------------------------------------*/ attr_list[i++] = NULL; FUNC_FAIL_RETURN(srv_uc_create_xml_element_start(fh,(U8*) SRV_UC_XML_ELEMENT_BODY,attr_list)); FUNC_FAIL_RETURN(srv_uc_create_xml_new_line(fh)); /* Slide */ i = 0; /*--------------------------------------------------------------------*/ memset(bg_color,str_len); bg_color[0] = '1'; //只有一张图片,一个slide attr_list[i++] = (U8*) SRV_UC_XML_ATTR_INDEX; attr_list[i++] = bg_color; /*--------------------------------------------------------------------*/ memset(fg_color,str_len); fg_color[0] = '5'; //只有5秒钟 attr_list[i++] = (U8*) SRV_UC_XML_ATTR_DURATION; attr_list[i++] = fg_color; /*--------------------------------------------------------------------*/ attr_list[i++] = NULL; FUNC_FAIL_RETURN(srv_uc_create_xml_element_start(fh,(U8*) SRV_UC_XML_ELEMENT_SLIDE,attr_list)); FUNC_FAIL_RETURN(srv_uc_create_xml_new_line(fh)); /*--------------------------------------------------------------------*/ i = 0; /*-----slide index----------------------------------------------------*/ memset(slide_num,str_len); sprintf((char*)slide_num,"1"); //只有一张图片,因此就只有一个slide,所以直接给定slide index为1 attr_list[i++] = (U8*) SRV_UC_XML_ATTR_ID; attr_list[i++] = slide_num; /*-----start time-----------------------------------------------------*/ memset(obj_num,str_len); sprintf((char*)obj_num,"0"); //只有一张图片,从0秒开始 attr_list[i++] = (U8*) SRV_UC_XML_ATTR_BEGIN; attr_list[i++] = obj_num; /*-----end time-------------------------------------------------------*/ memset(layout,str_len); sprintf((char*)layout,"5"); //只有一张图片,到5秒种结束 attr_list[i++] = (U8*) SRV_UC_XML_ATTR_END; attr_list[i++] = layout; /*--------------------------------------------------------------------*/ attr_list[i] = NULL; FUNC_FAIL_RETURN(srv_uc_create_xml_element_single(fh,SRV_UC_XML_ELEMENT_IMAGE,attr_list)); FUNC_FAIL_RETURN(srv_uc_create_xml_new_line(fh)); FUNC_FAIL_RETURN(srv_uc_create_xml_element_end(fh,(U8*) SRV_UC_XML_ELEMENT_SLIDE)); FUNC_FAIL_RETURN(srv_uc_create_xml_new_line(fh)); /* Object */ i = 0; /*-----object index---------------------------------------------------*/ memset(bg_color,str_len); bg_color[0] = '1'; //只有一个object,强制给定为1 attr_list[i++] = (U8*) SRV_UC_XML_ATTR_ID; attr_list[i++] = bg_color; /*-----attach---------------------------------------------------------*/ memset(fg_color,str_len); fg_color[0] = '0'; attr_list[i++] = (U8*) SRV_UC_XML_ATTR_ATTACH; attr_list[i++] = fg_color; /*-----virtual file---------------------------------------------------*/ memset(slide_num,str_len); slide_num[0] = '0'; attr_list[i++] = (U8*) SRV_UC_XML_ATTR_VIRTUAL_FILE; attr_list[i++] = slide_num; /*-----drm------------------------------------------------------------*/ memset(obj_num,str_len); obj_num[0] = '0'; attr_list[i++] = (U8*) SRV_UC_XML_ATTR_DRM; attr_list[i++] = obj_num; /*-----size-----------------------------------------------------------*/ memset(layout,str_len); sprintf(layout,applib_get_file_size(param->picpath)); attr_list[i++] = (U8*) SRV_UC_XML_ATTR_SIZE; attr_list[i++] = layout; /*-----offset---------------------------------------------------------*/ memset(txt_fit,str_len); txt_fit[0] = '0'; attr_list[i++] = (U8*) SRV_UC_XML_ATTR_OFFSET; attr_list[i++] = txt_fit; /*-----encoding-------------------------------------------------------*/ memset(img_fit,str_len); img_fit[0] = '0'; attr_list[i++] = (U8*) SRV_UC_XML_ATTR_ENCODING; attr_list[i++] = img_fit; attr_list[i++] = NULL; /* <obj> */ FUNC_FAIL_RETURN(srv_uc_create_xml_element_start(fh,(U8*) SRV_UC_XML_ELEMENT_OBJECT,attr_list)); FUNC_FAIL_RETURN(srv_uc_create_xml_new_line(fh)); /* name */ FUNC_FAIL_RETURN(srv_uc_create_xml_element_start(fh,(U8*) SRV_UC_XML_ELEMENT_NAME,NULL)); FUNC_FAIL_RETURN(srv_uc_create_xml_data_usc2_to_utf8(fh,(U8*)param->picname)); FUNC_FAIL_RETURN(srv_uc_create_xml_element_end(fh,(U8*) SRV_UC_XML_ELEMENT_NAME)); FUNC_FAIL_RETURN(srv_uc_create_xml_new_line(fh)); /* file path */ FUNC_FAIL_RETURN(srv_uc_create_xml_element_start(fh,(U8*) SRV_UC_XML_ELEMENT_FILE_PATH,(U8*)param->picpath)); FUNC_FAIL_RETURN(srv_uc_create_xml_element_end(fh,(U8*) SRV_UC_XML_ELEMENT_FILE_PATH)); FUNC_FAIL_RETURN(srv_uc_create_xml_new_line(fh)); /* </obj> */ FUNC_FAIL_RETURN(srv_uc_create_xml_element_end(fh,(U8*) SRV_UC_XML_ELEMENT_OBJECT)); FUNC_FAIL_RETURN(srv_uc_create_xml_new_line(fh)); /* it possible that the case happens: no object,but user press end key,Uc will save postcard in background,still need to create a empty postcard text object */ /* </body> */ FUNC_FAIL_RETURN(srv_uc_create_xml_element_end(fh,(U8*) SRV_UC_XML_ELEMENT_BODY)); FUNC_FAIL_RETURN(srv_uc_create_xml_new_line(fh)); } /* </mms> */ FUNC_FAIL_RETURN(srv_uc_create_xml_element_end(fh,(U8*) SRV_UC_XML_ELEMENT_MMS)); FUNC_FAIL_RETURN(srv_uc_create_xml_new_line(fh)); FS_Close(fh); return MMI_TRUE; #undef FUNC_FAIL_RETURN } /******************************************************************************* ** 函数: msgcmd_SendMMSResponse ** 功能: 创建并且发送MMS的回调函数 ** 入参: result -- ** rsp_data -- srv_mms_create_rsp_struct ** user_data-- ** 返回: 是否成功 ** 作者: wasfayu *******/ static MMI_BOOL msgcmd_SendMMSResponse(void *param) { MsgCmdMMSReq *rsp = (MsgCmdMMSReq*)param; MsgCmdMMSXmlData *xml = (MsgCmdMMSXmlData*)OslMalloc(sizeof(MsgCmdMMSXmlData)); memset(xml,sizeof(MsgCmdMMSXmlData)); //send to memcpy(xml->sendto,rsp->sendto,MMI_PHB_NUMBER_LENGTH+1); //subject memcpy(xml->subject,rsp->subject,sizeof(WCHAR)*(SRV_UC_MAX_SUBJECT_LEN+1)); //file name memcpy(xml->picname,rsp->picname,sizeof(WCHAR)*(MSGCMD_FILE_NAME_LENGTH+1)); //file full path memcpy(xml->picpath,rsp->picpath,sizeof(WCHAR)*(MSGCMD_FILE_PATH_LENGTH+1)); //other xml->priority = MMA_PRIORITY_MEDIUM; xml->expiry_time = SRV_UC_EXPIRY_NOT_SET; xml->delivery_report = SRV_UC_DELIVERY_IMMEDIATE; xml->read_report = FALSE; xml->hide_sender = FALSE; xml->delivery_report = FALSE; //xml file abs path #if defined(WIN32) { applib_time_struct mt; applib_dt_get_date_time(&mt); kal_wsprintf(xml->xmlpath,"%c:\\mc_%d%d%d.xml",MsgCmd_GetUsableDrive(),mt.nHour,mt.nMin,mt.nSec); } #else kal_wsprintf(xml->xmlpath,"%c:\\mc_%d.xml",drv_get_current_time()); #endif if (msgcmd_CreateMMSXMLFile(xml)) { MsgCmd_CreateAndSendMMS(rsp->sim,xml->xmlpath); } OslMfree(xml); } /******************************************************************************* ** 函数: MsgCmd_CreateAndSendMMSCb ** 功能: 创建并且发送MMS的回调函数 ** 入参: result -- ** rsp_data -- srv_mms_create_rsp_struct ** user_data-- ** 返回: 是否成功 ** 作者: wasfayu *******/ static void msgcmd_CreateAndSendMMSCb( srv_mms_result_enum result,void *rsp_data,S32 user_data) { srv_mms_create_rsp_struct *rsp = (srv_mms_create_rsp_struct*)rsp_data; MsgCmdMMSUserData *usd = (MsgCmdMMSUserData*)user_data; if (SRV_MMS_RESULT_OK == result) { srv_mms_send_req_struct req; req.msg_id = rsp->msg_id; req.send_setting = SRV_MMS_SETTING_SEND_ONLY; req.sim_id = (usd->sim==MMA_SIM_ID_SIM2) ? MMI_SIM_ID_SIM2 : MMI_SIM_ID_SIM1; req.storage_type = MMA_MSG_STORAGE_CARD1; req.is_rr = MMI_TRUE; srv_mms_send(&req); } //FS_Delete(usd->xmlpath); OslMfree(usd); mc_trace("%s,result=%d,msg_id=%d. rsp->result=%d.",__FUNCTION__,result,rsp->msg_id,rsp->result); } /******************************************************************************* ** 函数: MsgCmd_CreateAndSendMMS ** 功能: 创建并且发送MMS ** 入参: xml_path -- MMS布局文件,里面已经包含有电话号码这些了 ** sim -- mma_sim_id_enum ** 返回: 是否成功 ** 作者: wasfayu *******/ MMI_BOOL MsgCmd_CreateAndSendMMS( mma_sim_id_enum sim,WCHAR *xml_path) { MMI_BOOL result = MMI_FALSE; if (mms_is_ready() && srv_nw_usab_is_any_network_available()) { srv_mms_create_req_struct createReq; MsgCmdMMSUserData *userdata; memset(&createReq,sizeof(srv_mms_create_req_struct)); userdata = (MsgCmdMMSUserData*)OslMalloc(sizeof(MsgCmdMMSUserData)); memset(userdata,sizeof(MsgCmdMMSUserData)); userdata->sim = sim; app_ucs2_strcpy((S8*)userdata->xmlpath,(const S8*)xml_path); //createReq.msg_file_path[MMA_MAX_INTERNAL_FILENAME_LENGTH]; app_ucs2_strcpy((S8*)createReq.xml_filepath,(const S8*)xml_path); createReq.user_data = (S32)userdata; createReq.msg_id = 0; createReq.app_id = MMA_APP_ID_BGSR; //这个app id可以忽略 createReq.mode = MMA_MODE_EDIT; //这里必须是edit createReq.sim_id = sim; createReq.xml_size = applib_get_file_size(createReq.xml_filepath); createReq.call_back = msgcmd_CreateAndSendMMSCb; result = (MMI_BOOL)(SRV_MMS_RESULT_OK == srv_mms_create(&createReq)); } mc_trace("%s,result=%d.",result); return result; } #endif /******************************************************************************* ** 函数: MsgCmd_GetUsableDrive ** 功能: 获取系统可用的存储设备盘符 ** 参数: ** 返回: 返回盘符 0x43~0x47 ** 作者: wasfayu *******/ S32 MsgCmd_GetUsableDrive(void) { S32 drive = SRV_FMGR_CARD_DRV; if(!srv_fmgr_drv_is_accessible(drive)) { drive = SRV_FMGR_PUBLIC_DRV; } return drive; } /******************************************************************************* ** 函数: MsgCmd_CombineFilePath ** 功能: 组成文件的绝对路径,目录深度为一级 ** 参数: pathbuffer -- 装载输出路径的buffer ** length_in_byte -- out的长度,以字节为单位,长度应该大于32个字节以上 ** folder -- 文件夹的名字,如 L"audio" ** ext_name -- 扩展名的名字,如 L".mp3" ** 返回: 返回文件名地址,即没有前面的path,指向pathbuffer中某个元素的地址 ** 作者: wasfayu *******/ WCHAR *MsgCmd_CombineFilePath( WCHAR *pathbuffer,U16 length_in_byte,const WCHAR *folder,const WCHAR *ext_name) { applib_time_struct mt; WCHAR *filename; ASSERT(NULL != pathbuffer); ASSERT(NULL != folder); ASSERT(NULL != ext_name); memset(pathbuffer,length_in_byte); //先打印路径 kal_wsprintf( (WCHAR*)pathbuffer,"%c:\\%w\\",folder); //再打印文件名 filename = pathbuffer + app_ucs2_strlen((const kal_int8 *)pathbuffer); applib_dt_get_date_time(&mt); #if defined(WIN32) kal_wsprintf( filename,"%04d-%02d-%02d %02d%02d%02d%w",mt.nYear,mt.nMonth,mt.nDay,mt.nSec,ext_name); #else kal_wsprintf( filename,"%04d%02d%02d%02d%02d%08X%w",drv_get_current_time(),ext_name); #endif return filename; } /******************************************************************************* ** 函数: MsgCmd_SendIlm2Mmi ** 功能: 发送消息到MMI模块 ** 参数: msgid -- 消息ID ** msg -- 消息 ** 返回: 无 ** 作者: wasfayu *******/ void MsgCmd_SendIlm2Mmi(msg_type msgid,void *msg) { MYQUEUE message; message.oslMsgId = msgid; message.oslDataPtr = (local_para_struct *)msg; message.oslPeerBuffPtr = NULL; message.oslSrcId = MOD_MMI; message.oslDestId = MOD_MMI; mmi_msg_send_ext_queue(&message); } /******************************************************************************* ** 函数: TestMMSEntrance ** 功能: MMS发送测试入口 ** 参数: msgid -- 消息ID ** msg -- 消息 ** 返回: 无 ** 作者: wasfayu *******/ void TestMMSEntrance(char *number) { MsgCmdMMSReq *req; if (NULL == number) return; req = (MsgCmdMMSReq*)construct_local_para(sizeof(MsgCmdMMSReq),TD_CTRL | TD_RESET); //自己定义一个消息ID -- MSG_ID_MC_SEND_MMS_REQ #error please define one message ID. mmi_frm_set_protocol_event_handler( MSG_ID_MC_SEND_MMS_REQ,(PsIntFuncPtr)msgcmd_SendMMSResponse,MMI_FALSE); //这里请自己combine一个文件名字,目前仅仅是用来测试jpg图片的,暂时不支持其他 #error please modify code here -- req->picpath. req->picname = MsgCmd_CombineFilePath( req->picpath,MSGCMD_FILE_PATH_LENGTH*sizeof(WCHAR),MSGCMD_PHOTOS_FOLDER_NAME,L".jpg"); req->sim = MMA_SIM_ID_SIM1; strcpy(req->sendto,number); kal_wsprintf(req->subject,"%w",req->picname); MsgCmd_SendIlm2Mmi((msg_type)MSG_ID_MC_SEND_MMS_REQ,(void *)req); }好吧,当你看完上面的代码,我就不需要再做什么解说了,相信你已经能够理解了。转载请保持原文的完整性并注明原文出处!