BREW输入法适配小结

来源:互联网 发布:网络执法官破解版下载 编辑:程序博客网 时间:2024/06/01 22:49

花了两个礼拜的时间适配了几十个手机的输入法,总结了几个适配成功的关键点。

 

1、标准模式

  我称采用ITEXTCTL_SetSoftKeyMenu进行输入法选择的方式为标准模式,因为大部分事情都是API替你做了。但是对于这种模式,有一些地方API Reference里并没有说清楚,比如两个控件ITEXTCTL、IMENUCTL,各自的HandleEvent函数应如何调用,就没有找到标准的说明。我采用的是如下的调用方式:

 

IMENUCTL_HandleEvent(pme->m_pITextCtl,eCode,wParam,dwParam);

ITEXTCTL_HandleEvent(pme->m_pITextCtl,eCode,wParam,dwParam);

 

  即依次调用两个控件的HandleEvent函数。之前还采用过先处理ITEXTCTL_HandleEvent,如果该函数返回值为FALSE,再处理IMENUCTL_HandleEvent的方式。但试验发现前一种方式适配的手机更多。对于因采用该方式出现问题的手机,再做特殊处理。

 

  另外请将所有事件都传给这两个控件的HandleEvent函数处理,而不只是传入按键或触摸事件。

 

2、文本框大小

  ITEXTCTL控件大小对屏幕能否正常刷新有着重要影响。例如三星手机文本框不能过大,否则候选框显示会有问题;个别手机文本框又不能显示过小,否则软键盘无法显示,甚至手机直接重启。最后的处理方式是三星手机文本框高度为80~100,其余手机文本框加上底部菜单满屏显示。

 

3、中断恢复

  之前出现了各种问题。比如标准模式下的符号输入法、输入法切换菜单、华为等手机的手写输入框,都出现了中断后调用ITEXTCTL_Redraw无法正常刷新的bug。如果在中断事件EVT_SUSPEND来到时复制屏幕到一张内存位图,中断恢复后将这张内存位图绘制到屏幕,并且中断和恢复时均不改变ITEXTCTL的Active状态,便可以解决这类问题。但这种方式在个别手机上又会引出新问题,例如有些手机中断前后输入法状态会改变,保存屏幕位图的方法不适用。因此将中断恢复分为3种情况:

a.保存屏幕位图,resume时用这张位图重画屏幕。这种情况适于大部分手机。

b.resume时调用ITextCtl_Redraw重画屏幕。这种手机包括Coolpad2938/nokia8208/中兴C3621/中兴S189/华为C5600/摩托W562。

c.suspend时设置文本框Active状态为FALSE,resume时设置Active状态为TURE,并调用ITextCtl_Redraw重画屏幕。这种手机极少,记不清了。

 

4、EVT_CTL_TEXT_MODCHANGED事件

  这个事件表示输入方式发生了改变。个别手机在这个事件发生时需要调用ITEXTCTL_Redraw函数重绘,否则刷新不正常(可能是其它地方设置不对导致的,但是我没有找到直接原因)。目前发现有问题的手机有CORISE KS958K/中兴S189,这两款手机发生EVT_CTL_TEXT_MODCHANGED事件时需要立即重绘。更特殊的是中兴手机触摸屏手机R501/R630,发生这个事件后需要延时几毫秒后再调用ITEXTCTL_Redraw事件,才可以正常刷新。

 

5、AVK_CLR与AVK_SOFT2

  有些手机只有AVK_SOFT2键,而按该键竟然无法删除文本框或候选框里的文字,这可真是OEM的大bug。对于这种手机,接收到AVK_SOFT2的按键事件时,手动将wParam改为AVK_CLR可以解决问题。目前发现问题的手机是nokia8208

 

6、对于需要支持默认输入法的应用,请搞清输入法序号在手机上的正确编号。一般五种常用的输入法编号是:

 

数字=5

字母=3

拼音=9

笔画=10

符号=2

 

  但有一些触摸手机编号是从八十几开始的;一些手机有多于5种的输入法。建议出现问题时,采用标准模式切换输入法,并用ITEXTCTL_GetInputMode方法得到当前输入法的编号。

 

7、一些特殊情况

 

a.有候选字的情况下,按AVK_END键无法退出应用。试验发现,这时这些手机会发送EVT_USER事件。wParam参数爱国者手机是0x4c9,其余手机(Evertel EV701/QIGI V60)为0x4b4。接收到这种事件时强制退出程序即可。

 

b.和信I01,手写输入完成时会有黑色矩形覆盖在文本控件上方,需要重绘标题栏。重绘的时机是收到eCode为0x5beb的事件时。

 

c.诺基亚8208手机,选定或者取消候选字时,会发送EVT_DIALOG_END事件,需要手动调用ITEXTCTL_Redraw函数,清掉候选框。

 

d.三星手机拼音/笔画/符号输入时,底部的联想字候选菜单有很大问题。有时显示不出来,但按键会出字;光标位于行首时又无法去掉联想字候选框。第一个问题软件超市中的搜索也有,不打算改了;第二个问题仿照软件超市的搜索,光标位于行首时,按AVK_CLR直接视为取消输入,可能会引起其它问题,一段目前起作用的代码如下:

 

if(ITEXTCTL_GetCursorPos(pme->m_pITextCtl) == 0)

{

ITEXTCTL_SetInputMode(pme->m_pITextCtl,9);

ITEXTCTL_HandleEvent(pme->m_pITextCtl,EVT_KEY,AVK_POUND,0);

ITEXTCTL_SetText(pme->m_pITextCtl,NULL,-1);

......取消输入......

}

 

8、输入法bug较多,遇到问题可以先和软件超市里的搜索对比,只要做到和它一致就好了。

原创粉丝点击