搜档网
当前位置:搜档网 › MSTAR XMMI FAQ 常见技巧和问题解决方案

MSTAR XMMI FAQ 常见技巧和问题解决方案

MSTAR XMMI

FAQ

1.MMI相关 (6)

1.1如何解决进入待机时间长BUG(30秒-LCM背光时间)?(MMI) (6)

1.2如何增加Idle快捷菜单项目?(MMI) (6)

1.3APMF_INTERACTIVE_STOP如何使用,和APMF_ASYNC_STOP有什么区别?(MMI) (6)

1.4如何修改电话本快捷查找方式,前缀查找与默认遍历查找(Luffy 20090605)? (MMI) (7)

1.5GridWidget如何知道那个Item被touch?(MMI) (7)

1.6如何修改两个IMEA号为一个IMEA号码显示? (MMI) (7)

1.7IVECTORMODEL_ReplaceAt(pIVectorModel, idx, pv)加入空项的用法?(MMI) (8)

1.8如何获取某个widget里图片的格式 (cs.sun) (MMI) (8)

1.9如何后台发SMS(MMI) (8)

1.10AlarmAPP 中设置闹铃间隔响应的函数是哪个?(Brian)(MMI) (9)

1.11mae_swprintf的扩展使用?(MMI) (9)

1.12在condition和action中,得到event的两种方法?(MMI) (10)

1.13如何判断当前通话状态是1A、1H还是1A1H? (MMI) (10)

1.14如何在当前AP中,启动另一个AP,并传入参数。(MMI) (10)

1.15PHB中MMI_PHB_BOOK_TYPE_E中部分常用type的含义?(MMI) (10)

1.16闹钟响铃时,如何使数字等按键等效呆会再响按键?(MMI) (11)

1.17添加widget property时的注意事项(Luffy 20090623)(MMI) (12)

1.18来的信息判别是卡1还是卡2(MMI) (12)

1.19在menuwidget中加数字图标(MMI) (13)

1.20MsgFLEMGR_Read()的调用方法和用途 (14)

1.21关于wallpaper的存取 (cs.sun) (MMI) (14)

1.22手机按键与键盘按键对应关系(MMI) (14)

1.23添加系统能认知的Widget的方法? (MMI) (15)

1.24如何修改菜单的背景(MMI) (16)

1.25选择结束WAP时会退到WAP模块的主界面? (MMI) (16)

1.26关于ADDREF(pObj,pOwner) (cs.sun) (MMI) (16)

1.27如何取得字库的位图信息?(MMI) (17)

1.28如何增加待机界面指令?(MMI) (17)

1.29 View做切换时,如何实现向左、向右、向上、向下刷屏的效果?(MMI) (17)

1.30Shortcut启动的时候如何带参数给SM (Luffy 20090720)(MMI) (18)

1.31AdpterGet的使用—--如何设计实现显示动态菜单或很长的菜单(MMI) (18)

1.32如何在Menu Widget中显示Mark的Items和总共可被选择的Items?(Sunny) (MMI) (18)

1.33如何知道menu widget中某个菜单是否被Mark(Sunny) (MMI) (19)

1.34如何计算一个函数,或一段代码执行的精确时间?( Jean.Li) (MMI) (20)

1.35如何修改进入工模的口令(MMI) (20)

1.36对Model 的理解 (MMI) (22)

1.37怎样知道一个AP是否为top app. (MMI) (23)

1.38如何增加新的快捷键?(MMI) (23)

1.39如何去掉丝印功能快捷键?(MMI) (24)

1.40关于:MALLOC 与 SH_LoadPreDefinedResAsImage引起内存泄露的一个常见问题(MMI) (24)

1.41Model listener和View Model listener的区别(MMI) (25)

1.42用File manger获取文件系统中某张图片的步骤(MMI) (25)

1.43如何理解Mainmenu.vdf中Model的各项属性值?(MMI) (26)

1.44为什么设置IIMAGEWIDGET_StartAnimate后gif仍然不显示动画(cs.sun) (MMI) (27)

1.45如何修改屏幕上的softkey左,中,右三个按键的宽度(MMI) (28)

1.46如何取得某个App是否在运行,例如:CLSID_KEYGUARDAPP。(MMI) (28)

1.47获取parent interface 的两种方法。(MMI) (28)

1.48CTA软件修改普通笔记。(MMI) (29)

1.49如何设置softkey背景和status bar背景透明?(MMI) (29)

1.50为什么在listener中不要使用TRIGGER_EVT?(MMI) (29)

1.51MMI Task与其他Task进行沟通的两种方式的优缺点(HF.Lin): (MMI) (30)

1.52使用IIMAGE_SetDecodeParm()进行图片的缩放与旋转(MMI)(Luffy 20090819) (31)

1.53Title Widget中显示显示额外信息常常使用的ELMNT_MSK属性具体是什么含义(例如输入法界面右上角的输入法类型)?(MMI) (31)

1.54WAP上网,怎样修改主页和添加默认书签?(MMI) (32)

1.55IWIDGET_QueryInterface()的含义与用途 (32)

1.56PHB中重要的几个表介绍 (32)

1.57关于Content、Category接口的介绍(Luffy refers to Eric) (33)

1.58ICALLLOGSRV_ReadSimpLog接口的注意点 (34)

1.59系统是怎么滤去符合格式的文件 ? (34)

1.60CC中如何调用音频? (34)

1.61在CFG中申请的包含那个相同小块的大空间怎么使用 (34)

1.62interrupt table什么时候会被调用到? (35)

1.63在SH_StartAppletEx中,如何去释放参数所申请的空间? (36)

1.64Theme image id的用法解释(Luffy -2090911) (36)

1.65创建Dialog的两种方法 (37)

1.66关于多国语言的问题 (38)

1.67ButtonWidget 的click event 产生过程(zq.li 2009.9.17) (38)

1.68手机屏幕最底端的快捷方式是在哪里处理的?(cs.sun) (38)

1.69关于菜单触屏点击可以拖动(Luffy -20090921) (39)

1.70 如何在MFLCONTAINER中动态建立一个Inputwidget? (40)

1.71关于Text widget的slide属性: (42)

1.72Cfgsrv的几个事件说明(cs.sun) (43)

1.73在Mstar手机平台上,对于任何一个编辑区域中输入的多行内容,怎样去断行显示? (43)

1.74更换menuwidget的item的图标时为什么会内存泄露? (44)

1.75关于Disable figure command(Sunny) (45)

1.76如何在EM实现receiver播放MP3? (45)

1.77keguard 如何显示运营商名字 (45)

1.78Powe save timer简介(Sunny) (46)

1.79关于IWIDGET_SetHandler的使用 (47)

1.80keyguard中允许触摸改变背光灯时间区域 (48)

1.81百家姓的运作方式 (48)

1.82目前platform最多支持9 PDU的SMS,收到超过9 PDU的SMS的时候,会做什么处理? (48)

1.83如何获取时间显示到widget上? (49)

1.84关于MenuWidget/ListWidget/GridWidget之间的关系? (49)

1.85 输入法有没有支持把汉字转换成拼音的API接口,比如“大”“同”可以转换为“da”“tong”

50

1.86如何在手机中申请一块固定存储区域? (50)

1.87如何调整系统默认的短信条数,电话本条数,通话记录条数 (50)

1.88Sms Edit 界面候选字与号码重叠问题的解决方法 (50)

2.平台相关 (52)

2.1是否有获取机器上SIM卡数量的接口,并能确定是在哪个SLOT中? (52)

2.2恢复出厂设置后,主要恢复了哪些内容 (53)

2.3如何去掉版本信息里的时间 (54)

2.4文件系统与长度有关的两个宏定义所在位置 (54)

2.5NES游戏是否和网上一样的模拟器?网上下载的游戏是否可以运行?请问游戏需要拷贝到哪个

目录下面?是否可以详细介绍一下。 (54)

2.6SRV与SRV之间、SRV与AP之间用什么方式通信,有几种通信的方式? (55)

2.7目前XMMI平台支持的SMS编码格式有哪些?之间有什么区别? (55)

2.8如何修改短信最大条数限制 (55)

2.9如何从DataBase完全删除一个文件? (55)

2.10VDF中经常会遇到的格式问题( cs.sun) (56)

2.11NES游戏是否和网上一样的模拟器?网上下载的游戏是否可以运行?请问游戏需要拷贝到哪个

目录下面?是否可以详细介绍一下。 (56)

2.12listener 与 notify (cs.sun) (56)

2.13手机自带铃声支持那些格式(Ryan) (57)

2.14如何理解State Machine 中,一个事件激发多种状态转换是可能的? (57)

2.15当浏览Menu的子项时,如何在标题中更新子项的名称? (58)

2.16使用Imedia来播放音乐的一些注意点? (58)

2.17修改系统皮肤的方法: (60)

2.18AP :A 启动 AP:B 的整个流程 EMBEDDED方式?(platform flow) (zq.Li) (60)

2.19MAE中Model的种类以及每个Model简单描述? (62)

2.20IARRAYMODEL使用的一些问题? (62)

3.Driver相关 (63)

3.1通过IMEDIA_Play_RAW();播放WAV类型的数据后,再调用IMEDIA_SetVolume();调节音量,为什

么没有效果?(DRIVER) (63)

3.2如何实现开机键控制快速进入省电功能? (64)

3.3工程模式中“Register Write”和“Register Read“如何使用? (64)

3.4系统按键音资源在哪里 (64)

3.5如何解决SIM卡反问题? (66)

3.6如何把RF硬件为4频的配置成2频? (66)

3.7如何修改触摸屏默认校准参数? (66)

3.8如何修改触摸屏最大压力参数? (67)

3.9如何修改按LSK+RSK+#进行重启功能?(热键修改方法) (67)

3.10 如何替换mcp(例如从128+32替换到256+64) (67)

3.11开机过程中LCM函数的调用顺序? (68)

3.12如何调MP3增益? (68)

3.13如何设定通过Reciever播放MP3? (69)

3.14新加sensor和调试camera相关的几个步骤 (69)

3.15关于产线上某一手机开不了机问题的分析与解决 (70)

3.16如何修改正常开机、充电开机、关机电压? (70)

3.17关于E2P中W_BAND的设置 (70)

4.工具相关 (71)

4.1如何在XMMI平台上添加及删除一个字库?(TOOL) (71)

4.2在Base工程里面的setting加shortcuts无论编译delta还是base工程, 模拟器上idle界面下边

的icon会显示不出来,而target上能正常显示? (Jean) (TOOL) (71)

4.3 手机开机时,若T卡上没有所需的文件夹,如何让手机自己建立?(TOOL) (71)

4.4模拟器能不能模拟无sim卡时的情况?(TOOL) (72)

4.5VS2005 出现异常,cl.exe 编译不过的问题(TOOL) (72)

4.6关于Trace与 BackTrace的一些Basic Info. (TOOL) (72)

4.7怎样使用含有%格式的字符串(String with % Symbol)sunny(TOOL) (73)

4.8如何更改VS Debugging 路径?(TOOL) (74)

4.9如何查看手机flash里面RAI中的内容(TOOL) (75)

4.10 怎样修改Cygwin默认启动路径?(TOOL) (75)

4.11关于XRG编译报vdf_data_H.tmp no found 错误的原因及解决方法?(TOOL) (75)

4.12关于XRG字符串长度的支持(TOOL) (75)

4.13工程名用中文命名后,XRG编译会报错 (TOOL) (75)

4.14 如何检查内存泄漏(TOOL) (76)

4.15如何提供Demo的Simulator包给客户(只有模拟器没有代码 Luffy 20090805)(TOOL) (76)

4.16如何用模拟器模拟WAP功能?(TOOL) (77)

4.17用模拟器发小区广播(TOOL) (78)

4.18在一个工程中建多个项目;(Kally)(TOOL) (78)

4.19如何编译JAVA (kally) (79)

4.20如何让simulator显示一个sim卡? (80)

FAQ

1.MMI相关

1.1如何解决进入待机时间长BUG(30秒-LCM背光时间)?(MMI)

修改csl_sys.c

csl_SysErrCode_e csl_SysActiveIdleToLightSleepTimer(void)

#if 1//MSZ

vm_rtkStartTimer(EMA_SYS_IDLE_TO_LIGHT_SLEEP_TIMERID, FALSE, CUS_MBX_EMA,

VM_RTK_MS_TO_TICK(5000));

#else

vm_rtkStartTimer(EMA_SYS_IDLE_TO_LIGHT_SLEEP_TIMERID, FALSE, CUS_MBX_EMA,

VM_RTK_MS_TO_TICK(30000));

#endif

1.2如何增加Idle快捷菜单项目?(MMI)

答:

1、提供一张快捷菜单图标图片和一张background图片,并用XRG中加入到

proj\sc\customer\default\src\mmi\resource\xmmi_base_Res\image\QVGA\SHORTCUT中

2、在XRG Engineer mode中Setting/Allow Master Restore Items/Idle Pet Clock feature中照原有的配置项的

格式添加data,并修改shortcutbar item order中的值

3、在proj\sc\application\mmi\common\inc\mmi_layout_qvga.h and mmi_layout_qvga.h添加第一步中增加的

两张图片的图片的尺寸

4、按照proj/sc/application/mmi/app/desktopwidget中gamewidget的做法新增一个widget,写出相关的源

文件,并修改相关源文件。

5、在VS2005中增加添加的源文件。

1.3APMF_INTERACTIVE_STOP如何使用,和APMF_ASYNC_STOP有什么区别?(MMI)

首先讲APMF_ASYNC_STOP。如果AP设定属性为APMF_ASYNC_STOP,如果APM要将该AP 关闭,那么AMP会发MAE_EVT_APP_STOP给AP,但是并不会马上关闭该AP,直到该AP向APM确定可以关闭(SH_ConfirmAppletState(APM_CFM_STOPPED))。

如果AP设定属性为APMF_INTERACTIVE_STOP,那么也有和APMF_ASYNC_STOP一样的效果。

但不同的是,AP向APM的回复不一样。APM要关闭AP时,如果AP向APM回复SH_ConfirmAppletState (APM_CFM_PROCEEDING),那么这个效果和APMF_ASYNC_STOP是一样的。但AP也可以向APM 回复SH_ConfirmAppletState(APM_CFM_CANCELED),即告诉APM我不能被关闭,那么APM不会去做关闭AP的动作。

1.4如何修改电话本快捷查找方式,前缀查找与默认遍历查找(Luffy 20090605)? (MMI)

电话本查找方式当前平台默认为遍历查找,比如号码名称“一二三”之需要输入其中一部分缩写便可查到条目,例如“e”(“二”的缩写);而mxx平台使用的方法为前缀查找,即必须输入“y”才能找到该条目。另种方法之间的区别再与比较算法的选择。具体代码在MMI_PHB_DH_GetFilterContacts()函数中,修改方式如下:

修改1:

//if(strstr((char *) pContent->u8MultiWordPrefix, (char *) pAscii)) //平台默认遍历查找

if(0 == strncmp((char *) pContent->u8MultiWordPrefix, (char *) pAscii,strlen(pAscii)))//前缀查找修改2;

//if(mae_wstrstr(pwcUCS2Str, pwcSearchStr)) //平台默认遍历查找

if(0 == mae_wstrncmp(pwcUCS2Str, pwcSearchStr,mae_wstrlen(pwcSearchStr))) //前缀查找如需扩展菜单提供两种方式供用户选择,则需添加一个flag到cfgsrv,每次调用查找函数的时候作为附加判断条件。

1.5GridWidget如何知道那个Item被touch?(MMI)

首先GridWidget的每个Item的model都放在vector model中,通过对vector model设置监听函数对其中各个Item的model进行监听,一旦EVT_VIEWMDL_FOCUS_SELECT发生,可以获取pMdlEvent 的参数dwParam而得到是哪个Item被touch。

1.6如何修改两个IMEA号为一个IMEA号码显示? (MMI)

#ifndef __MSTAR_DUAL_SIM_E2P__

mae_mwprintf(L"%s\n",imei_buf+1);

=

pOutputText

#else

#ifdef __DUAL_SIM_ONE_STANDBY_MMI__

if (0 == mae_wstrcmp(imei_buf, imei_buf_2))

{

// if imei 1 == imei 2, then only show one info

mae_mwprintf(L"%s\n",imei_buf+1);

=

pOutputText

}

else

{

mae_mwprintf(L"%s

1:\n%s\n%s 2:\n%s\n", pIMEI, imei_buf+1, pIMEI,

=

pOutputText

imei_buf_2+1);

}

#else

pOutputText = mae_mwprintf(L"%s\n",imei_buf+1);

//pOutputText = mae_mwprintf(L"%s 1:\n%s\n%s 2:\n%s\n", pIMEI, imei_buf+1, pIMEI, imei_buf_2+1); #endif

#endif//__MSTAR_DUAL_SIM_E2P__

*(MAE_WChar **)Output = pOutputText;

0;

return

1.7IVECTORMODEL_ReplaceAt(pIVectorModel, idx, pv)加入空项的用法?(MMI)

在gridwidget中,如果删除其中的一项,位置就会重新排列。如果你想不让他们重新排列位置,可以使用IVECTORMODEL_ReplaceAt(pIVectorModel, idx, pv),用空项来替换你想要删除的一项。用这个函数产生空项的用法是IVECTORMODEL_ReplaceAt(pIVectorModel, idx, (void*)NULL),只要最后一项参数变成空指针就可以了。

1.8如何获取某个widget里图片的格式 (cs.sun) (MMI)

可以调用IIMAGEWIDGET_GetImageInfo(pw,pi)函数,其中pw为指向该widget的指针,pi为一个指向ImgWdg_ImgInfo_t类型的指针. ImgWdg_ImgInfo_t结构如下:

typedef struct ImgWdg_ImgInfo_tag

{

ImageInfo imgInfo;

u32 PrefferedFameWidth;

}ImgWdg_ImgInfo_t;

图片的信息存放在imgInfo的结构体里的format值中.成功调用IIMAGEWIDGET_GetImageInfo(pw,pi)函数后可以通过pi.imginfo.format 来获得.对应的值为枚举类型分别对应如下的格式: enum

{

IMG_FORMAT_UNKNOWN = 0,

IMG_FORMAT_BMP,

IMG_FORMAT_PNG,

IMG_FORMAT_GIF,

IMG_FORMAT_JPG,

IMG_FORMAT_PROGRESSIVE_JPG,

IMG_FORMAT_WAPBMP,

IMG_FORMAT_TOTAL,

};

1.9如何后台发SMS(MMI)

调用ISMS_SMS_SendSMS_Without_Notify()

定义为:#define ISMS_SMS_SendSMS_Without_Notify(pICntlr, p1, p2, p3, p4) GET_FUNCTBL((pICntlr), ISMS)->SMS_SendSMS_Without_Notify( pICntlr, p1, p2, p3, p4)

其实现函数原形为:

static MAE_Ret mmi_SMS_SMS_SendSMS_Without_Notify(ISMS *pISMS, SMS_MSG_SentData_t* pSendData, pfn_sms_send_CB fnSendCB, IBase* pObj, u32 userData);

调用实例:

SMS_MSG_SentData_t *pSMSMsgData = NULL;

MAE_WChar *pDesStr = NULL;

MAE_WChar *pPhoneNum = NULL;

pDesStr = (MAE_WChar *)MALLOC(sizeof(MAE_WChar)*(MAX_SMS_LEN+1));

mae_wstrncpy(pDesStr,_T("Hello Word for sms"),MAX_SMS_LEN);

pPhoneNum = (MAE_WChar *)MALLOC(sizeof(MAE_WChar)*(MAX_TELNUMBER_LEN+1));

mae_wstrncpy(pPhoneNum,_T("189********"),MAX_TELNUMBER_LEN);

pSMSMsgData->dataLen = mae_wstrlen(pDesStr);

pSMSMsgData->ptData = pDesStr;

pSMSMsgData->tEncoding = EncodingUCS2;

pSMSMsgData->simModule = DUAL_MASTER; //must decide DUAL_MASTER or DUAL_SLA VE pSMSMsgData->telNoLen = mae_wstrlen(pPhoneNum);

pSMSMsgData->ptTelNo = pPhoneNum;

ISMS_SMS_SendSMS_Without_Notify(pThis->pSMS,pSMSMsgData,NULL,(IBase*)pThis,0);

if(NULL != pSMSMsgData)

FREE(pSMSMsgData);

if(NULL != pDesStr)

FREE(pDesStr);

if(NULL != pPhoneNum)

FREE(pPhoneNum);

1.10AlarmAPP 中设置闹铃间隔响应的函数是哪个?(Brian)(MMI)

AlarmApp中,由于平台目前的闹铃间隔时间只有一个,即5mins,所以并不是做的和别的Ap一样的处理,此时间单独做的一个宏定义接口,定义在:mmi_common_custom.h,定义格式如下:// the waiting timer of an auto-snooze alert

#define AUTOSNOOZE_INIT_WAITING_IN_SEC 300

如果需要扩充闹铃间隔时间,可以修改此宏定义,增加间隔时间选项则必须自己增加Setting选项,目前平台对闹铃间隔时间再响的处理是:User presses SNOOZE key or there is no input during alarm duration,then

System creates a new alarm that wakes up at five minutes later.

1.11mae_swprintf的扩展使用?(MMI)

mae_swprintf的定义是u32 mae_swprintf( MAE_WChar *zBuf, int count, const MAE_WChar *zFormat, ...);第一个参数是字串输出需要的buffer,第二个参数是输出的最大字符数,第三个参数是所输出的字串,缺省的参数是用来控制字串的变量,是可以扩展的。有两种方法,第一种是在XRG中修改字串,比如TXT_PML_P_REDIAL_TIME对应的字串是“Remaining time=%d”,现在要在它的后面显示重拨次数,可将TXT_PML_P_REDIAL_TIME的内容修改为“Remaining time=%d Redial %d times”,另一种方法是用L引出,如“L"%s%d%s%d"”,并给第四个参数传入两个变量。

1.12在condition和action中,得到event的两种方法?(MMI)

在condition 和action中,有两种方法得到event,第一种是常用的MAE_SM_GetCurrentEvent(void * pSM, MAE_EventId * outputEvt, u32 * outputParam1, u32 * outputParam2)函数。另一种是传进来的一个参数“SM_t* pSM”,pSM的结构体为:typedef struct SM_Tag

{

SM_Event_t* curEvt; /**< the event during processing */

} SM_t;

其中就有当前要得到的消息的指针,并且当前消息中的两个参数也可以直接得到,方法是pSM->curEvt->param1和pSM->curEvt->param2。

1.13如何判断当前通话状态是1A、1H还是1A1H? (MMI)

可以通过

CCSRV_Mode_e ccsrv_mode;

csrv_mode=ICCSRV_GetActiveMode( (ICCSRV*)pThis->pCcSrv );

来获得当前的通话状态,在1A1H状态时,如果要进行切换,可以通过调用

ICCSRV_SwapCalllReq((ICCSRV*)pThis->pCcSrv );

这个函数来进行。

1.14如何在当前AP中,启动另一个AP,并传入参数。(MMI)

可以采用ISHELL_StartAppletEx()函数,它比ISHELL_StartApplet()多带一个参数,这个参数就是用来导入新建立的AP的。

该函数原型是:MAE_INLINE MAERet_t ISHELL_StartAppletEx(IShell *pShell, MAEClsId_t ClsId, u32 Mode, IApplet_it **ppApplet, u32 Param, pfnStartParamCleanup_t fnClean) 。

其中,函数中的参数Param 可以是一个普通变量,也可以是一个结构体。但在传递时,必须强制转为u32 类型。

1.15PHB中MMI_PHB_BOOK_TYPE_E中部分常用type的含义?(MMI)

enum

{

0, //unknown

MMI_PHB_BOOK_TYPE_UNKNOWN =

MMI_PHB_BOOK_TYPE_ECC = 1, // ECC Emergency Call Codes

Abbreviated

Dialing

sim(AND

2, //master

MMI_PHB_BOOK_TYPE_ADN_M =

Numbers)

3, //slave

sim

MMI_PHB_BOOK_TYPE_ADN_S =

MMI_PHB_BOOK_TYPE_ADN_M_ADN_S = 4, //master sim and slave sim

MMI_PHB_BOOK_TYPE_FDN = 5, // FDN Fixed Dialing Numbers

6,

=

MMI_PHB_BOOK_TYPE_BDN

=

7,

MMI_PHB_BOOK_TYPE_LDN

8,

=

MMI_PHB_BOOK_TYPE_LRN

9,

MMI_PHB_BOOK_TYPE_LMN

=

=

10,

MMI_PHB_BOOK_TYPE_LXN

MMI_PHB_BOOK_TYPE_SDN = 11, // SDN Service Dialing Numbers MMI_PHB_BOOK_TYPE_MSISDN = 12, // MSISDN (SIM own numbers)

Box

13, //Mail

=

MMI_PHB_BOOK_TYPE_MBX

=

14, //phone

MMI_PHB_BOOK_TYPE_ADR

MMI_PHB_BOOK_TYPE_ADR_ADN_M = 15, //phone and master sim

sim

slave

and

MMI_PHB_BOOK_TYPE_ADR_ADN_S

=

16, //phone

MMI_PHB_BOOK_TYPE_ADR_ADN_M_ADN_S = 17, //phone master sim/slave sim

Card

Business

MMI_PHB_BOOK_TYPE_BCARD =

18, //

18, //type

max

=

MMI_PHB_BOOK_TYPE_MAX

};

1.16闹钟响铃时,如何使数字等按键等效呆会再响按键?(MMI)

在dialogapp.c中,有一段代码

else if(MAE_KEY_SKRIGHT == keycode)

{

_DIALOGAPP_NotifySrv(pThis->pDialogInfo, DIALOGAPP_EVT_RSKPressed);

}。

意思是说,当右键按下时,实行里面的函数,将此代码改为:

Else if(((MAE_KEY_SKRIGHT==keycode)

&&(pThis->pDialogInfo->nDialogViewID !=COMMON_DIALOG_ALARMDIALOG))

||((pThis->pDialogInfo->nDialogViewID==COMMON_DIALOG_ALARMDIALOG)

&&((MAE_KEY_0== keycode)

keycode)

||(MAE_KEY_1==

keycode)

||(MAE_KEY_2==

keycode)

||(MAE_KEY_3==

keycode)

||(MAE_KEY_4==

keycode)

||(MAE_KEY_5==

keycode)

||(MAE_KEY_6==

keycode)

||(MAE_KEY_7==

keycode)

||(MAE_KEY_8==

keycode)

||(MAE_KEY_9==

keycode)

||(MAE_KEY_STAR==

keycode)

||(MAE_KEY_HASH==

keycode)

==

||(MAE_KEY_SKRIGHT

)

)

)

{

_DIALOGAPP_NotifySrv(pThis->pDialogInfo, DIALOGAPP_EVT_RSKPressed);

}

这样,当闹钟响铃时,按下数字等按键等同于按下右键,是响铃呆会再响。

1.17添加widget property时的注意事项(Luffy 20090623)(MMI)

在mae_widget_properties.h可以添加新的property给widget用从而做更多的事情(用法如helloworld_widget一样,放在vdf里边去set,之后widget.c会自己去get、set、做事情),但是请注意一定要加在一个enum的最后面,否则会导致画面显示乱掉。原因是在mae层一部分id在build *.lib的时候被build成了固定的值,如果加id在中间会导致后面的id被顶掉引起错乱。

1.18来的信息判别是卡1还是卡2(MMI)

第一步:通过mmi_simsrv.c中的接口ISIMSRV_GetIMSI(pSIMSRV, pThis->CurIMSI_M, SIMSRV_SIM_ID_e )可以得到卡1 、卡2 的对应的IMSI值; CurIMSI_M定义如下,SIMSRV_SIM_ID_e 的值为可以选择下面几个值,意义见注解。

u8 CurIMSI_M[10];

typedef enum

{

SIMSRV_SIM_AUTO = 0, //For single SIM inserted or auto select Master for two SIM inserted.

mode.

DUO

SIMSRV_SIM_MASTER, //Master

SIM

for

DUO

mode.

for

SIM

SIMSRV_SIM_SLA VE,

//Slave

SIM.

SIMSRV_SIM_NONE

//No

} SIMSRV_SIM_ID_e。

第二步:得到来信的IMSI值。短信的IMSI保存在SMS_MsgDataHdr_t中,彩信的保存在SMI_MMSHdr_t 中。

第三步:用memcmp函数比较两个IMSI值可以分辨出信息是发给那张SIM的。

介绍如下:短信和彩信在File里保存的Header分别是SMS_MsgDataHdr和SMI_MmsHdr_t,相比于以前的版本,为了区别来信是发给卡一还是卡二,新加了ismi来保存新信息发给是那张卡的imsi号。

其次:

对于短信是在mmi_moi.c的_MOI_WriteRawDataFile函数中添加以下代码来得到信息的传给SIM卡的IMSI号。

对于彩信mmi_mmstranssrv.c中的mmi_MMSTRANSSRV_NewMmsNotifyCnf添加

1.19在menuwidget中加数字图标(MMI)

目前我们版本的menuwidget中,数字图标只能支持到12,超过的话就都显示12.解决的方法是在增加图标。步骤如下:

1.首先把你的图标的图加入文件夹

proj\sc\customer\SZ\src\mmi\resource\delta_Res\image\QVGA\COMMON内,这里是delta资源文件,如果想要加入base资源中时,就是把delta_Res这个目录换成xmmi_base_Res这个就可以了。

2.在XRG中加入把你要加入的图标添加进去,然后编译下就能产生图标的ID。

3.然后再在文件mae_menuwidget_priv.h中的NumericIconTbl[]数组后面加入你的图标ID就可以了。

1.20MsgFLEMGR_Read()的调用方法和用途

MsgFLEMGR_Read()是mmi_common_sms_storage提供的一个用来读取短信数据的函数。它的调用方法是:第一步:得到指定短信的filepath;

strcpy((char*)u8MsgName,"m");

sprintf((char*)u8StrTemp,"%d",u16MsgId);

strcat((char*)u8MsgName,(const

char*)u8StrTemp);

u8MsgName);

mae_AsciiToUCS2(u16TempMsgName,

MFMSGPATH);

mae_wstrcpy(filePath,

mae_wstrcat(filePath,

u16TempMsgName);

第二步:根据filepath调用MsgFLEMGR_OpenFile()函数打开短信数据;

pIFStream = MsgFLEMGR_OpenFile(pThis->pIFileMgr, filePath, "r", (IBase*)pThis);

第三步:就是调用MsgFLEMGR_Read()获得指定位置的数据;

nRetVal = MsgFLEMGR_Read(pIFStream, pMsgData,0, pFileInfo->fileSize, &numRead);

它的第一个参数是指向file stream的指针,由第二步调用的函数获得;第二个参数是一个存放短信数据的buffer;第三个参数和第四个参数分别是需要读取数据的开始和结尾地址;第五个参数是所读出的数据。

1.21关于wallpaper的存取 (cs.sun) (MMI)

wallpaper 的更新在idleapp的updatewallpaper()函数里,在其他ap中涉及到wallpaper可能调用到mmi_common_updatewallpaper()函数,但是这个函数只是获取当前的wallpaper并显示.

在idleapp的updatewallpaper中也处理了finger command rotate 即滑动更换手机壁纸的操作. 当手机壁纸像素过大时,解析起来很慢,这个解析的过程发生在将image放入imagewidget中,如果一旦将大的image放入了imagewidget中,在idleap被suspend掉后又回来的时候,显示大图片的速度很快的.因为不需要在解析了,具体看以参考idle AP.

每次壁纸有更新,当第一次需要显示壁纸时就会解析新的壁纸并将它放入imagewidget中,如果解析成功且T卡有插在手机上,这时就会将这个新的壁纸的缓存写入T卡中,具体位置在T卡的隐藏文件夹 .svn 中,下次如果壁纸有更新会首先来T卡查找缓存是否已经存在,如果存在,直接读取缓存.如果没有,则正常读取图片并解析.

1.22手机按键与键盘按键对应关系(MMI)

如下图所示,手机上的数字键与键盘上的数字键对应。另外,在VC中start DeBugging后有2个运行界面MSTAR phone和MSTAR simulator,在MSTAR phone界面操作时可以通过按下F4键来实现显示/隐藏MSTAR simulator 界面。

1.23添加系统能认知的Widget的方法? (MMI)

假定现在已经有了一个CLSID,一个继承自WidgetBase_t的数据结构, 一些函数(Draw、EventHandler、SetSize....etc), 如何把这些联系起来,并让系统认知呢?(比如sh_createInstance中传入自定义的CLSID,会自动调用Ctor函数)。

Class ID和NEW()函数的mapping table定义在:mmi_clstbl.h:

所以 createInstance就和New()连接起来了。

在NEW()当中,设计者要自己写code去呼叫改widget的Ctor,这件事情并不是shell帮你做或者自动会发生的。

至于在widget当中的draw,EventHandler等函数是定义在function table里面,如果你没有去overwrite 的function就得用base class所提供的function,关联就可以通过这样一个流程建立起来。

1.24如何修改菜单的背景(MMI)

1.图片更换: ..\image\QVGA\COMMON\ COMMON_IMG_SYSTEM_BG.png

2.代码修改:..\proj\sc\application\mmi\widgets\src\ mae_menuwidget.c

if ((CLSID_TXTGRID_MENUWIDGET != pThis->nClsId) &&

(CLSID_IMGGRID_MENUWIDGET != pThis->nClsId))

{

// set default border size & color

//begin

//MenuWidget_SetProperty(pThis,

PROP_MENU_WDG_ITEM_UNDERLINE_STATUS, TRUE);

MenuWidget_SetProperty(pThis, PROP_MENU_WDG_BG_IMAGE_ID, THM_COMMON_IMG_SYSTEM_BG);

modify

//end

}

如果想改其它的widget的背景,也用类似的方法去修改。

1.25选择结束WAP时会退到WAP模块的主界面? (MMI)

按如下方法修改:

mmi_CDWapApp_ExplorerOptionMenuListener

case MNU_CDWAPAPP_EXIT_EXPLOR:

{

//Exit CDWAPApp

//SH_PostEvent((IHandler *)pThis, CDWAPAPP_EVT_OPEN_WAITING_DLG, 0, DLG_EXIT_APP);

SH_PostEvent((IHandler *)pThis, CDWAPAPP_EVT_RETURN_MAIN_PAGE, 0, 0);

}

修改为

{

//Exit CDWAPApp

SH_PostEvent((IHandler *)pThis, CDWAPAPP_EVT_OPEN_WAITING_DLG, 0, DLG_EXIT_APP);

//SH_PostEvent((IHandler *)pThis, CDWAPAPP_EVT_RETURN_MAIN_PAGE, 0, 0);

}

注意加好条件判断,不要影响到正常WAP的使用

1.26关于ADDREF(pObj,pOwner) (cs.sun) (MMI)

ADDREFIF(pObj, pOwner),或ADDREF(pObj, pOwner)这两个函数都有2个参数,其中第一个参数是需

要被addref的obj, addref的本质也是为了保证obj所在的这块内存在还有人用的情况下不被shell release

掉. 而另外一个参数则是拥有这个obj的人. 也就是说,我们的系统不仅仅记录了这块内存有没有人在用,

同时也记录了谁在用,而第二个参数就是记录的谁在用.

所以如果你开了一个接口可以让其他obj问你要一个东西的话(比如一个指向某个image的指针),那

么需要在这个接口函数的参数里加一个参数表明是哪个obj调用的这个接口从而会获得这个指针.而在这

个接口函数里需要

ADDREF(p(这个指针),obj(调用这个接口的obj)); 而不是ADDREF(p,pThis);

1.27如何取得字库的位图信息?(MMI)

可以通过函数取得位图信息,函数是:ven_font_ret_t ven_font_createGlyph(ven_FontAttr *pFontAttr,

u16 nCode, ven_Glyph_t **ppGlyph);其中nCode是需要取得位图的字,参数ppGlyph就是位图信息。其中

typedef struct

{

u32 width; ///< pixel width

u32 height; ///< pixel height

u32 pitch; ///< Bytes per row in bytes

u16 bpp; ///< Bits per pixel

u8 *pData; ///< Pointer to glyph raw data

}ven_Glyph_t;

结构,pData是字库的raw data.

1.28如何增加待机界面指令?(MMI)

1 mmi_common_util.h中加(目的是为区分输入的中文和英文指令)

COMMON_SEQ_SPECIFIC_CHNIESE, /**

2 mmi_common_util.c中对MMI_Common_ParseGsmSeq函数做相应的代码添加,用代码检测是否是输入

的指令。

3 在dialerapp.c的_DIALERAPP_LaunchCCSrv函数中加相应的代码,如果是输入的语言转换指令就需要

做相应的语言转换处理,并且要注意与setting设置中的同步。

4 修改后,可以实现在待机版面输入指令*#0086#可以切换到中文,×#0044#可以切换到英文。

其中“0086”和“0044”是international dialing code 是特定的。

1.29 View做切换时,如何实现向左、向右、向上、向下刷屏的效果?(MMI)

从1.03版本开始,就有部分AP在做界面切换时,有向左、向右、向上、向下刷屏的效果,那么这

个是怎么实现的呢?其实,只要在AP的VDF里,添加一些VIEW的属性就可以了。如:设置下面属性

时,可以实现进入AP会有向左刷屏的效果,退出AP有向右刷屏的效果。

Value="MMI_VIEWTRANSITION_FULLSCR_LEFT"/>

Value="MMI_VIEWTRANSITION_FULLSCR_RIGHT"/>

另外,属性ID是定义在mae_view_defines.h的,属性Value,是定义在mmi_common_transtion.h 的。

在代码里边实现的接口是:

IVIEW_SetEntryTransitionID(pMenuView, MMI_VIEWTRANSITION_FULLSCR_LEFT);

IVIEW_SetExitTransitionID(pMenuView, MMI_VIEWTRANSITION_FULLSCR_RIGHT);

可以修改VIEW进出的刷屏方式。放在IVIEWMGR_SetView()之前,另外还有一些类似接口定义在mae_view.h。

1.30Shortcut启动的时候如何带参数给SM (Luffy 20090720)(MMI)

每个Menu可以定义去关联一个shortcut id,并在mmi_shortcutssrv_priv.h中用

SHORTCUTS_FUNC_INFO_ELEMENT()注册,这个函数注册的时候会有几个变量,其中第二个SHORTCUTS_PARAM_XXXX是带给启动ap时候SM的一个参数,使用方法是先在xrg里边定义这样一个SHORTCUTS_PARAM_XXXX再在ShortcutParamToAPParamTbl对应位置加入这个id对应的值

/enum(与shortcut id一样要严格遵守顺序)。

这样做的好处是可以用不同的menu去launch到同一个instance中不同的栏目,只需要在启动ap的时候去收pSM->curEvt->param2(param1是string),例如sp项目中的用法。

1.31AdpterGet的使用—--如何设计实现显示动态菜单或很长的菜单(MMI)

当用户要显示动态菜单时,比如信息收件箱中的信息显示,由于memory有限是不可能在显示一屏时把所有的信息在vdf中加载好的,所以此时选用AdapterGet来设置动态菜单解决了这个问题。

用户通过定制AdapterGet函数来给MainMenu model准备数据,然后使用

IMENUMODEL_SetAdaptGet(pMainMenuModel, mmi_MCA_MainMenuAdapterGetItem, pThis)来设置数据到mainmenu model中去,mmi_MCA_MainMenuAdapterGetItem这个函数就是用户定制的准备model数据的函数。

1.32如何在Menu Widget中显示Mark的Items和总共可被选择的Items?(Sunny) (MMI)

如下图所示红色标记的部分显示的是Mark的菜单个数和总共可被Mark的菜单个数,现列出其关键VDF并加以说明。

"TITLEWDG_ELMNT_MSK(TITLEWDG_ELMNT_ID_SMS_TEXT) |

TITLEWDG_ELMNT_MSK(TITLEWDG_ELMNT_ID_TITLE_TEXT)"/>

……

……

Value="ITEM_DISP_STYLE_ALWAYS_TWOLINE|CHECK_RADIO_STYLE_MARK"/>

关于上面VDF的几点说明:

1、将Title widget的PROP_TITLE_WDG_LAYOUT属性设为“TITLEWDG_ELMNT_MSK

(TITLEWDG_ELMNT_ID_SMS_TEXT) | TITLEWDG_ELMNT_MSK

(TITLEWDG_ELMNT_ID_TITLE_TEXT)

2、Menu widget的Ability设为"CHANGE_TITLE"

3、Menu widget的"PROP_MENU_WDG_ITEM_STYLE"属性设为"CHECK_RADIO_STYLE_MARK"

4、Menu widget的PROP_MENU_WDG_MAX_MARKED_SIZE "属性设为可以选择的最大值;(注意:3、

4项顺序不能改变)

5、设定当前View的"PROP_VIEWTITLE_WDGID"属性,值指定为当前View的Title widget ID。

1.33如何知道menu widget中某个菜单是否被Mark(Sunny) (MMI)

在上条FAQ(如何在Menu Widget中显示Mark的Items和总共可被选择的Items)中提到将menu widget 的style设置为可被Mark,那么如何知道某一个menu item是否被mark呢?

答案是使用IMENUMODEL_GetItemFlagAt(pIMenuModel,idx,pe)这个函数对某一个item进行检查,然后用MENUMODEL_IS_ITEM_SELECTED这个Marco对获取到得pe参数做一个检测,如果返回值为TRUE,表示该Item被选中。检测所有Menu item需要对每个menu item 进行扫描判断,代码如下:

u32 idx =0;

u32 flag =0;

for(idx=0;idx

{

IMENUMODEL_GetItemFlagAt(pIMenuModel,idx,&flag);

(MENUMODEL_IS_ITEM_SELECTED(flag))

if

{

selected...

//Be

}

else

{

selected..

//Not

}

}

设置某个Menu item是否被设置也可以用IMENUMODEL_SetItemFlagAt函数。

1.34如何计算一个函数,或一段代码执行的精确时间?( Jean.Li) (MMI)

上代码:

start = mmi_rtc_GetOsTick();//记录tick数

);//就是看这个函数运行了多久,这里也可以是一段代码

mmi_xxx_func(

……;

=

mmi_rtc_GetOsTick();

end

VM_RTK_TICK_TO_MS(end - start );//转化成毫秒

1.35如何修改进入工模的口令(MMI)

在XMMI平台,有两种方式进入工模,分别为:

1 输入“*#*#1705#”,再按“拨号键”,可以进入研发手机测试模式,用于研发人员对手机进行相关测

试。

2 输入“*#*0*” ,再按“拨号键”,可以进入工厂产品测试模式,用于生产线上对手机进行相关测试。

但是,这两个口令并不是固定的,可以根据需要自定义设定。

在mmi_common_util.c文件里,MMI_Common_ParseGsmSeq()有这样的接口,这个接口的主要作用是对输入的各种口令进行解析,然后根据不同的口令,返回对应的返回值,进而启动对应的程序。

(1)修改“*#*#1705#”。

首先,先了解“*#*#1705#”是如何被设置的。在MMI_Common_ParseGsmSeq()有这样一段代码,它的作用就是如何判断用户输入的是否是为“*#*#1705#”。在这里,代码会先去判断输入的字串中,第一个和第二个是否为*#,最后一个字母是否为“#”,然后再进一步判断第三、四个字串是否为“*#”及字串长度,最后再判断是否为“1705”,如果输入的字串全部符合,返回值COMMON_SEQ_SPECIFIC将会被送出,然后调用MMI_Common_ParseGsmSeq()的地方会根据得到的返回值启动进入工模的程序。下图是设置“*#*#1705#”的代码。

相关主题