您的位置:首页 > 移动开发 > Android开发

Android原生PinyinIME的Subtype相关调查(手头没有源码,明天补上...)

2013-12-24 19:58 225 查看
最近在处理Android源码中Google PinyinIME的一些问题。在Android4.4上遇到了一个比较奇怪的问题。 

CTS测试无法通过,因为Android4.4 的CTS测试项中增加了一个对系统输入法SubtypeCount的检测断言,如果getSubtypeCount的值小于1(即系统输入法支持的subtype为0),则CTS测试失败。而Google PinyinIME的subtypeCount就是为0。

一直都在处理APP侧的问题,对输入法FW端的源码也不熟悉。刚拿到这个问题,想当然的认为肯定是FW端的问题。一番排查无果。

其实Google PinyinIME的subtypeCount一直都为0,只是4.4之前没有对subtype有严格的检测罢了。这是为什么呢?

最终通过查找跟踪源码,找到了原因。在FW端的InputMethodInfo.java中,我们看到了subtype是如何解析并添加subtype list中的,getSubtypeCount其实就是返回这个list的size()。

1) 我们看到解析过程都是一个资源文件路径: com.android.internal.R.

这个资源路径从哪可以找到呢? 直接查找FW肯定是找不到的。

2)我们找到了它在out下的对应文件:out/target/common/R/com/android/internal/R.java

3)然后通过查看2)中文件的内容。我们发现,其实InputMethodInfo.java中com.android.internal.R.之后的名称,对应的都是另外一个名称。然后在FW下查找这个名称。我们发现它其实对应的是:

frameworks/base/core/res/res/values/attrs.xml

终于找到了!

查看attrs.xml文件的内容,我们发现其中的InputMethod_Subtype下边定义了一些字段。
查找这些字段就会发现,它们其实是在各个输入法app端的res/xml/method.xml中定义的。

4)于是你就会发现,PinyinIME的res/xml/method.xml并没有定义subtype的值对。而其它系统输入法都有。
仿照别的系统输入法的写法,加上。问题解决。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: