对Contacts了解就会知道(不了解可以了解下),每个联系人都有一个sort_key字段,如果查询中没有设置sortOrder,默认就会以 sort_key字段为排序依据。名字的检索其实也是根据sort_key来做的(比如拨号盘的模糊匹配:数字转成字母,再到拼音,最后得到汉字)。sort_key是根据名字生成的:如果联系人名字中包含字母,sort_key和name保持一致;如果名字是汉字,生成的sort_key,拼音-汉字-拼音-汉字。。。其中拼音全大写,中间以空格分割,如:”张三“-----sort_key:"ZHANG 张 SAN 三"。
当名字发生变化Sort_key是在packages/providers/ContactsProvider/src/com/android /providers/contacts/ContactsProvider2.java中生成的。具体调用如下:
调用了packages\providers\contactsprovider\src\com\android\providers \contacts\ContactLocaleUtils.java中的ChineseContactUtils.getSortKey()方法,具体实现如下:
以上调用了frameworks/base/core/java/com /android/internal/util/HanziToPinyin.java(下文附源码)中的方法得到了拼音,当然转换实现需要本地的支持,但是此处只要取得这个文件即可完成在android上从汉字到拼音的转换。从路径可以看出HanziToPinyin.java是一个内部类,不能直接调用,不过可以把这个文件取出来放在自己的项目中直接使用。调用也很简单方便,上边基本给出了,看下HanziToPinyin的源码就比较清楚了。以下是我写的一个调用:输入汉字返回拼音,字母原样返回,都转换为小写(默认取得的拼音全大写)。
当名字发生变化Sort_key是在packages/providers/ContactsProvider/src/com/android /providers/contacts/ContactsProvider2.java中生成的。具体调用如下:
if (displayNameStyle == FullNameStyle.CHINESE ||
displayNameStyle == FullNameStyle.CJK) {
sortKeyPrimary = sortKeyAlternative =
ContactLocaleUtils.getIntance().getSortKey(
displayNamePrimary, displayNameStyle);
}
调用了packages\providers\contactsprovider\src\com\android\providers \contacts\ContactLocaleUtils.java中的ChineseContactUtils.getSortKey()方法,具体实现如下:
ContactLocaleUtils.getIntance();
取得实例,然后调用:
1. public String getSortKey(String displayName, int nameStyle) {
return getForSort(Integer.valueOf(nameStyle)).getSortKey(displayName);
}
2. @Override
public String getSortKey(String displayName) {
ArrayList<Token> tokens = HanziToPinyin.getInstance().get(displayName);
if (tokens != null && tokens.size() > 0) {
StringBuilder sb = new StringBuilder();
for (Token token : tokens) {
// Put Chinese character's pinyin, then proceed with the
// character itself.
if (Token.PINYIN == token.type) {
if (sb.length() > 0) {
sb.append(' ');
}
sb.append(token.target);
sb.append(' ');
sb.append(token.source);
} else {
if (sb.length() > 0) {
sb.append(' ');
}
sb.append(token.source);
}
}
return sb.toString();
}
return super.getSortKey(displayName);
}
以上调用了frameworks/base/core/java/com /android/internal/util/HanziToPinyin.java(下文附源码)中的方法得到了拼音,当然转换实现需要本地的支持,但是此处只要取得这个文件即可完成在android上从汉字到拼音的转换。从路径可以看出HanziToPinyin.java是一个内部类,不能直接调用,不过可以把这个文件取出来放在自己的项目中直接使用。调用也很简单方便,上边基本给出了,看下HanziToPinyin的源码就比较清楚了。以下是我写的一个调用:输入汉字返回拼音,字母原样返回,都转换为小写(默认取得的拼音全大写)。
package com.spare.pinyin;
import java.util.ArrayList;
import com.spare.pinyin.HanziToPinyin.Token;
public class PinYin {
//汉字返回拼音,字母原样返回,都转换为小写(默认取得的拼音全大写)
public static String getPinYin(String input) {
ArrayList<Token> tokens = HanziToPinyin.getInstance().get(input);
StringBuilder sb = new StringBuilder();
if (tokens != null && tokens.size() > 0) {
for (Token token : tokens) {
if (Token.PINYIN == token.type) {
sb.append(token.target);
} else {
sb.append(token.source);
}
}
}
return sb.toString().toLowerCase();
}
}
以下附上frameworks/base /core/java/com/android/internal/util/HanziToPinyin.java源码
更新:4.X上代码位置已变更packages/providers/ContactsProvider/src/com/android/providers/contacts/HanziToPinyin.java,内容也有所改变,已基于android4.2源码提取并上传。在2.X和4.X上均测试通过。
下载地址:http://download.csdn.net/detail/spare_h/4881592

这篇博客介绍了如何在Android系统中实现汉字转拼音的功能,引用了com.android.internal.util.HanziToPinyin.java源码,并提到了在4.x版本上的代码变更。提供了在2.x和4.x上测试通过的代码下载链接。
&spm=1001.2101.3001.5002&articleId=6733547&d=1&t=3&u=968d867a87824e9abf00d1032fdc6991)
2360

被折叠的 条评论
为什么被折叠?



