联系人姓名的多音字的匹配
Eg:百家姓"乐"显示在L分组中,应该是显示在Y分组
详细操作步骤:
1.创建"乐"姓联系人
2.查看联系人列表中该联系人的位置
测试结果:
2.该联系人显示在L分组中
期望结果:
2.百家姓中"乐"字读yue,应该显示在Y分组
包:com.android.providers.contacts中的HanziToPinyin.java做修改
//为联系人名字做多音字匹配
//forsepcialHanzi handle
public static Map<String,Pair<Integer,String>>specialHanziString = new HashMap<String, Pair<Integer,String>>();
static {
specialHanziString.put("银行", newPair<Integer,String>(1,"航"));
specialHanziString.put("院长", newPair<Integer,String>(1,"涨"));
}
在下面的方法中进行汉字转拼音的处理
publicArrayList<Token> get(final String input) //One Hanzi character which haspinyin will be treated as a Token
//for sepcialHanzi handle
int replace_pos = -1;
char replace_char = 0;
for (Map.Entry<String,Pair<Integer,String>> cur
: specialHanziString.entrySet()){
int pos = -1;
pos = input.lastIndexOf(cur.getKey());
if(pos != -1) {
replace_pos = pos +cur.getValue().first;
replace_char =cur.getValue().second.charAt(0);
break;
}
}
该段code是进行名字中有多音字时选择想要的音的处理
在for循环中继续做如下处理
//for sepcialHanzi handle
boolean isSpecial = false;
if(replace_pos != -1 &&replace_pos == i) {
t = getToken(replace_char);
isSpecial = true;
} else {
t = getToken(character);
}
//for sepcialHanzi handle
if(isSpecial) {
t.source =sb.append(character).toString();
}
tokens.add(t);
sb.setLength(0);
//为联系人的姓做多音字匹配
private boolean isFamilyName = false;//加入isFamilyName是因为要做名字的多音字的匹配
public static Map<String, Character> specialHanzi = newHashMap<String, Character>();
static {
specialHanzi.put("8d3e", '\u7532'); // 贾--甲
specialHanzi.put("5355", '\u5584'); // 单--善
specialHanzi.put("6c88", '\u6df1'); // 沈--深
specialHanzi.put("4ec7", '\u6c42'); // 仇--求
specialHanzi.put("89e3", '\u8c22'); // 解--谢
specialHanzi.put("7fdf", '\u5b85'); // 翟--宅
specialHanzi.put("67e5", '\u4e4d'); // 查--乍
specialHanzi.put("66fe", '\u589e'); // 曾--增
specialHanzi.put("665f", '\u6210'); // 晟--成
specialHanzi.put("4e50", '\u6708'); // 乐--月
specialHanzi.put("533a", '\u6b27'); // 区--欧
specialHanzi.put("51af", '\u9022'); // 冯--逢
specialHanzi.put("7e41", '\u5a46'); // 繁--婆
specialHanzi.put("957f", '\u8d26'); // 长--帐
specialHanzi.put("77f3", '\u65f6'); // 石--时
specialHanzi.put("67cf", '\u6446'); // 柏--摆
specialHanzi.put("6734", '\u666e'); // 朴--普
specialHanzi.put("7f2a", '\u79d2'); // 缪--秒
}
//改方法是把汉字字符转化为得到token
privateToken getToken(char character) {
if((specialHanzi.get(Integer.toHexString(character))!=null)&&(isFamilyName== true)){
character = specialHanzi.get(Integer.toHexString(character));
}
在上面的get()方法中可以做判断isFmialyName是不是为true,
if (i == 0) {
isFamilyName = true;
} else {
isFamilyName = false;
}