原文转自孙志岗老师Sunner的博客:http://blog.sunner.cn/2009/04/android_pinyin_sorting/
文章写的是针对Android1.0, 1.1及1.5(Cupcake)版本的。新版本亦基本相同,只要稍微解决一下编译问题就可以了。
在这里感谢一下Sunner老师,你真强大!
======================= Sunner 原文 =============================
很久以前做了这个补丁,有幸的是朋友们都还算喜爱它,没白费功夫。不少朋友来信问它的原理,现在就讲一下。不过里面很多地方要靠回忆,未必很精确。如果你不能重现我所写的,欢迎提醒。另外要说明的是,下面所有的一切都是针对android 1.0的。
整个补丁的制作分五个步骤。
1. 制作支持中文排序和文字转换拼音的icudt38l.dat文件
先说一下icu4c。这是一个非常强大的开源软件,基本上把所有多语言要处理的问题都解决了。android对语言的处理主要就是调用它,但并没有包括中文相关的数据。所以先要把中文数据加进去。
android编译过程中直接将external/icu4c/stubdata/icudt38l.dat做为数据文件编译到目标代码中。所以只要向此文件添加中文的东西就行了。
我用的方法是直接下载icu4c的源代码,然后修改source/data/coll/root.txt ,把data/coll/zh.txt的内容“合理地”替换进去。为了减少体积,只替换pinyin相关的东西。编译。
参考external/icu4c/stubdata/helper.sh,用新做好的coll/root.res替换icudt38l.dat里的coll/root.res,并将icu4c目标文件里的translit/Han_Latin.res translit/root.res添加进去。
制作好的icudt38l.dat文件可以从这里 下载。放到external/icu4c/stubdata/目录下,用“make libicudata”编译android,应该很快就能得到新生成的libicudata.so。用它替换ROM的同名文件,就已经能中文排序了(只对新增或修改过的联系人有效,详见第4步)。
2. 打开icu4c的translit功能
打开这个功能才能实现中文到拼音的转换,也才能实现快速检索。
打开的方法应该是修改external/icu4c下的某个编译配置文件。但具体改哪个,改成什么我记不清了。源代码也没在随时可以查看的机器上。等查到了,再来补写吧。
icu4c.diff 里可以看到打开的方法,涉及到数个文件的简单修改。
3. 改变android为联系人建索引的方式
在联系人数据库中有一个peopleLookup表。它只有两个字段,第一个是token,第二个是联系人id。只要从键盘输入的字符和token能对应上,就会将改id的联系人显示在检索结果中。所以,只要把联系人的拼音写到token,就能实现用硬键盘快速检索。
所有的修改都集中于external/sqlite/android/sqlite3_android.cpp。这个文件为sqlite增加了一些 android需要的功能,其中就有一个_TOKENIZE()函数。它的功能就是在指定的表中建立对给定id和字符串的索引。它还能对字符串进行分割,比如sunner sun,会建立三个索引“sunner”,“sun”和“sunner sun”。这就是android联系人功能的初始形态。
_TOKENIZE()的实现是tokenize()函数。我在这里面调用了icu4c的功能,把中文转换成拼音字串,然后再建索引,于是就能拼音检索了。就这么简单,代码也不长,在sqlite3_android.diff 中。不过现在不在手边,以后再放上来。
4. 制作数据库刷新脚本
将上述修改编译后,替换到ROM中,并不能马上使用这些功能。因为现存联系人的各种索引信息都是旧的,必须更新一下它们。更新的方法很简单,就是把每个联系人的名字都写回一遍,然后把联系人数据库中的索引都更新一下。细节都在ROM升级文件的updatedb.sh中。
5. 制作ROM升级文件
替换system分区中的文件最好是在系统启动前,否则很可能会造成空间丢失。所以最终把这个补丁做成了一个update.zip,可以用刷机的方式刷上。
做它主要用到的工具是JF’s Build Environments(http://forum.xda-developers.com/showthread.php?t=475381 )里的testsign.jar。
分析已有的update.zip文件,就能知道它的基本结构,很简单。按这个结构放好几个要替换的文件,写好update-script脚本(关于这个脚本的语法,只能从android源码获得,在recovery/commands.c里),打成zip包,然后
java -jar testsign.jar src.zip dst.zip
这里的src.zip是前面做好的压缩包,dst.zip就是最终产品。
大概就是这样。
分享到:
相关推荐
当用户下拉列表时,它会触发刷新操作,更新联系人数据。 5. **异步加载(AsyncTask)**:如果联系人数据量较大,为了避免阻塞主线程,通常会在后台线程(如`AsyncTask`)中加载数据,然后在UI线程中更新列表。这样...
在Android平台上,汉字字母检索是一种常见的功能,它允许用户通过输入汉字首字母或者拼音来快速查找目标汉字。这种功能在各种应用中都有广泛的应用,比如联系人应用、词典应用等。下面将详细讲解实现这一功能的技术...
在Android平台上,获取手机联系人并进行字母排序以及实现按字母检索功能是常见的需求,尤其在开发通讯录类的应用时。这个"Android 获取手机联系人并按字母排序,且可根据字母右侧A~Z检索"的项目,是一个适用于毕业...
在Android开发中,实现字母排序,类似于通讯录的字母检索功能,是一项常见且重要的任务。这一功能使得用户能够快速定位并查找目标联系人,极大地提高了用户体验。本项目名为"Android字母排序 (类似通讯录字母检索)...
在Android系统中,联系人管理是一项重要的功能,用户可以存储、组织和检索联系人的信息。在Android应用开发中,实现联系人字母排序和搜索是提升用户体验的关键环节。本篇文章将详细探讨这一主题,重点关注如何在...
在Android开发中,字母排序(Alphabet Indexing)是一种常见的功能,它被广泛应用于通讯录、联系人列表等场景,方便用户快速定位和查找所需条目。本Android应用源码着重展示了如何实现类似通讯录的字母检索功能。...
在实现字母排序时,Adapter需要根据数据源(如联系人姓名列表)进行排序,并更新界面。 3. **AlphabetIndexer**:Android提供了一个名为AlphabetIndexer的类,用于处理字母索引。它需要一个Cursor对象(通常是...
4. **联系人数据获取**:在Android中,获取系统联系人通常需要权限请求。在`Manifest.xml`中添加`READ_CONTACTS`权限,并在运行时检查和请求权限。之后,使用`ContentResolver`查询`ContactsContract`中的数据来获取...
Android联系人的库函数检索介绍了多种检索方式,包括但不限于联系人名字查询、联系人电话查询等。通过使用Cursor类和getContentResolver()方法,开发者可以对联系人数据进行灵活的查询操作。 在设计和实现联系人...
android通讯录功能,实现了如下功能 1....检测系统通讯录是否有变化,有变化在通知栏通知,并更新联系人列表功能.rar,太多无法一一验证是否可用,程序如果跑不起来需要自调,部分代码功能进行参考学习。
4. **拼音转换**:在中文环境中,由于汉字没有直接的字母表示,通常需要通过拼音库(如Pinyin4j)将汉字转换为拼音,以便进行字母排序。 5. **监听器**:设置监听器监听字母栏的点击事件,当用户点击特定字母时,...
全文检索原理及实现 全文检索原理及实现 全文检索原理及实现
在Android开发中,构建一个根据字母排序的城市列表是一项常见的任务,尤其在开发地图应用或信息检索类应用时。这个任务涉及到UI设计、数据处理以及排序算法等多个知识点。下面将详细阐述实现这一功能所需的关键技术...
在安卓(Android)开发中,实现类似通讯录的字母排序功能是常见的需求,这使得用户可以快速找到联系人。这个压缩包文件“安卓Android源码——安卓Android字母排序 类似通讯录字母检索.rar”可能包含了实现这一功能的...
在Android开发中,字母排序(也称为快速索引或字母检索)是一种常见的功能,尤其在类似通讯录的应用中,用户可以通过点击字母表来快速定位到特定联系人的姓名。本源码示例着重于实现这一功能,它可以帮助开发者理解...
在Android应用开发中,字母排序功能常常用于实现类似通讯录的快速检索,使得用户可以通过字母索引快速定位到目标联系人。本项目“Android应用源码之Android字母排序 类似通讯录字母检索”是一个适用于毕业设计学习的...
支持混合排序:混合字符串处理、中英文排序、右侧悬浮栏、顶部名称提示栏、滚动悬浮提示,运行效果图一看便知,目前Android机常见的通讯录搜索功能,本例模拟实现的效果还是让人很满意的。
### 航班信息排序与检索知识点解析 #### 一、背景介绍 在现代信息技术领域,数据处理是一项至关重要的任务。特别是在航空业这样的大规模服务行业中,有效地管理航班信息显得尤为重要。航班信息通常包括航班号、起点...