Android 2.2 (Froyo) 中文联系人拼音检索增强补丁

Froyo终于开始官方支持在任何系统语言下都能把中文联系人按照拼音顺序排序,并且支持全拼和简拼(可以从名字中间任意一字的拼音开始)检索。这要感谢一位叫Bai Tao的工程师。

不过,google的改进有一点不如我以前的补丁,只是很小的一点,就是用“gdg”可以搜索到“郭德纲”,而“gdgang”不行。gdgang这种简全混合的模式在同一简拼的联系人较多的时候,只要比纯简拼多敲1-2个字符,就能让检索的结果好很多。比如“gdga”可以过滤掉郭得乖、国大贵、关定格等等。

下面这个补丁,就补全了这个功能:

--- a/src/com/android/providers/contacts/ContactLocaleUtils.java
+++ b/src/com/android/providers/contacts/ContactLocaleUtils.java
@@ -102,7 +102,13 @@ public class ContactLocaleUtils {
                 final Token token = tokens.get(i);
                 if (Token.PINYIN == token.type) {
                     keyPinyin.insert(0, token.target);
-                    keyInitial.insert(0, token.target.charAt(0));
+                    if (i == tokenCount - 1) {
+                        // Use all characters of the last token
+                        keyInitial.insert(0, token.target);
+                    } else {
+                        // Use the first character of other tokens
+                        keyInitial.insert(0, token.target.charAt(0));
+                    }
                 } else if (Token.LATIN == token.type) {
                     // Avoid adding space at the end of String.
                     if (keyPinyin.length() > 0) {
@@ -112,7 +118,13 @@ public class ContactLocaleUtils {
                         keyOrignal.insert(0, ' ');
                     }
                     keyPinyin.insert(0, token.source);
-                    keyInitial.insert(0, token.source.charAt(0));
+                    if (i == tokenCount - 1) {
+                        // Use all characters of the last token
+                        keyInitial.insert(0, token.source);
+                    } else {
+                        // Use the first character of other tokens
+                        keyInitial.insert(0, token.source.charAt(0));
+                    }
                 }
                 keyOrignal.insert(0, token.source);
                 keys.add(keyOrignal.toString());

我已经编译好一个,安装方法如下:

  1. 下载ContactsProvider.apk,通过adb、Root Explorer等覆盖Android系统的/system/app/下的同名文件;或者下载pyin-patch-froyo-0.1.zip,用刷rom的方法刷一下。
  2. 更改两次系统的语言(比如:中文->英文->中文),并且更改后等一小会儿,让系统在后台刷新联系人检索关键词数据库。
  3. 搞定!

以上内容在CM 6.0 RC3 for G1测试通过。理论上说,只要是2.2的Rom应该都能用,除非厂商自己在ContactsProvider里动了手脚。

欢迎反馈使用情况。如果比较多人喜欢这个,可以考虑提交给google……

Android 2.2 (Froyo) 中文联系人拼音检索增强补丁” 中有 38 条评论

  1. 请教,是不是手机必须root后才能如上操作啊?
    能否做个update.zip呢,我自己弄得老提示签名错误。
    谢谢!

  2. 明白。看来我要等一段时间才能用上这个补丁了。
    我是desire港版未root直接OTA升级的2.2,现在据说还无法破解呢。

  3. 你好,我用了Android 2.2 (Froyo) 中文联系人拼音检索增强补丁,用的是刷机的方法,我的手机是g7,用的rom是cm6正式版,2.2的rom,但是刷了这个之后,只要开机就提示android.process.acore已意外停止,点确定之后又弹出,无限弹出,不能正常使用系统,请问这个该怎么办

      1. 那是不是说这个补丁包不适用我刷的rom了?我刷这个补丁包没有wipe,是不是因为这个的原因?

  4. 在我的G7上不能使用这个软件(直接拷贝、刷机、放进ROM中),要报好几个进程错误,(港版2.2ROM,root)。能不能在改个在G7上可用的呢?或者说明一下如何把你的代码加入到原版的程序中?

  5. sunner 老师好,根据你的方法修改 ContactLocaleUtils.java 的确很好的实现的 全简拼 检索的问题,但是 全简拼 的另外一个情况,如你所说比如
    “郭德纲”,输入 guodg 这样就检索不出来,是联系人检索关键词数据库没创建该关键词吗? 如果完成该功能也是修改ContactLocaleUtils.java吗?

    对了,如果 gdeg 也能检索的话,android 全简拼 检索的问题应该就算全部解决了哦!

    1. 现在只支持gdgang,因为我觉得这就足够了。其它的全简混合意义不大,新增加的检索词还会影响性能。当然,这只是我的看法。如果你需要这些功能,可以自己改。只修改ContactLocaleUtils.java应该就能实现。

      1. 根据log在ContactLocaleUtils.java中改了一下,可以进行各种简全混合检索。没有真机,不知道联系人数据量巨大的情况程序效率如何。

        另外有个问题,不知道sunner老师是否了解,就是用发布的froyo sdk,然后adb install -r 我修改之后的ContactsProvider.apk,这样是可以检索和排序的。如果我自己完整的编译sourc code,居然连基本的拼音排序都没有了。是否存在一个编译宏之类的东西来控制是否能进行拼音检索呢?

        求解!!!

          1. 根据froyo默认配置编译,发现 NativeCollation.getAvailableLocalesImpl()返回的仅仅为:
            en en_AU en_BE en_BW en_CA en_GB en_HK en_IE en_IN en_MT en_NZ en_PH en_SG en_US en_US_POSIX en_VI en_ZA en_ZW es es_ES es_US,没有包含zh_CN,所以编译的system.img运行后不能进行pinyin排序。

            应该是icu4c中有个配置文件的东西来确定读取哪些coll,因为icu4c/data/coll目录下的文件非常的全, Sunner老师对此有研究嘛???

              1. froyo libicudata.so 默认编译时关联us.dat,怪不得只包括en和es。

                google虽然放了zh.dat,但在编译脚本中却没加入,需要自己添加,并指定为默认。然后编译即可。

  6. 我也是出同样的错误,现在联系人根本就打不开了。怎么能恢复到原版的状态呢,请教。谢谢!

  7. G7 港版2.2 root 用刷机的方式更新补丁 现在一开机就报错 联系人进去后一直显示“正在加载” contactsprovider.apk 显示为 未安装 怎么恢复到原状呢 谢谢!

  8. 我使用的是HD2,安装了破解的Android 2.2 Froyo版本。
    这个是基于模拟器刷机的,不是硬刷。自己用RE替换了apk,发现进入联系人后一直停留在“正在载入”界面。
    请问,有办法解决这类问题不?
    把我的这个Contact的apk文件发给你,可以帮我直接修改不?

  9. 我也是这个问题, 把原来的APK文件覆盖后, 发现进入联系人后一直停留在“正在载入”界面。有什么办法可以解决啊? 急!!! 多谢!!

  10. Android整个系统的排序都只是西方语言的字母顺序排序,没有把中文纳入考量。像我的语设定是英文,但在中文跟英文混杂的列表中,中文都被放在英文后,而且滚动条拉到底部只能到Z字母开头的项目,中文项目必须滑动列表来操作。整个Android系统中竟然只有联系人列表将中文字依照中文排序,像音乐播放器、软件列表或任何系统文件夹浏览器等里面的列表似乎都不支持。相信如果能将系统的排序法修改,应该能够将整个Android里的排序法都修正。

  11. 我为什么失败了?谢谢回复
    我的步骤:
    1. 下载最新的froyo 版本,用:“repo init -u git://android.git.kernel.org/platform/manifest.git
    repo sync”
    2.编译得到 system.img.
    3.把编译好的system.img放入sdk image位置,start 模拟器,还是没有按中文排序,但sdk里人家自带的system.img可以按照中文排序。

    大侠帮忙分析分析,非常感谢。

      1. 那您知道怎么配置吗?我在网上没搜到具体的配置方法,感觉正如“rambo 在
        2010年09月26日 于 1:34 下午
        ”说的,但不知道怎么把“zh.dat”编译进去。

  12. HTC G7 Desire 亚太版RUU_Bravo_Froyo_hTC_Asia_WWE_2.13.707.1_Radio_32.44.00.32U_5.09.05.30_2_release_143921_signed.exe

    按照本方法测试不成功(覆盖apk的方式)

  13. 支持啊,我现在也是用的D2G ,咋个能够解决这个问题哟,找了半天没有没有ContactsProvider.apk这个文件,咋回事呢?

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注