今天用了整整一下午去捣鼓这块,为什么模拟器上可以按拼音排序,中英文混排,及按字母搜索联系人,但到了开发板(平台是根据android2.2改过的)上就怎么不行了呢,虽然现在还没有解决,但也是知道了问题所在,离解决之路也就不远了

好吧,现在就解释下android2.2是怎么按拼音排序的。

首先我们来看下android.2自带通讯录的数据库文件contacts2.db的raw_contacts表。用sqlitedbviewer工具打开后可以看到有这么一个字段:sort_key(sort_key_alt与之相似,只不过是英文环境下有个按given name还是first name排序的问题)。

正常状况下,我们新建一个联系人的话,如果是英文,则sort_key与display_name字段显示相同,如果输入姓名是中文,如“你好”,sort_key则会显示“ni 你 hao 好”,这样开发者既可以根据此字段按拼音排序,中英文混排,以及按拼音搜索联系人拉。

现在就说下,android是如何将中文名的联系人转化为拼音存到sort_key里面的:

if (displayNameStyle == FullNameStyle.CHINESE ||

displayNameStyle == FullNameStyle.CJK) {

sortKeyPrimary = sortKeyAlternative =

ContactLocaleUtils.getIntanc).getSortKe(displayNamePrimary, displayNameStyle);}

这段代码是运行在contactsprovi2.Java的updateRawContactDisplayName()方法里面,这段代码我们用到了ContactLocaleUtils.java这个类,所以我们进入它以后最显眼的就是ChineseContactUtils这个ContactLocaleUtils的子类,它重写了ContactLocaleUtils的getSortKey()方法,如下:

public String getSortKey(String displayName) {

ArrayList 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();

}

returnsuper.getSortKey(displayName);

}

首先我们看 ArrayList tokens = HanziToPinyin.getInstance().get(displayName);,因为其他的无非就是插入格式的问题,我们暂时不用看。

android如何将汉字转为拼音的?这就用到了HanziToPinyin这个类,好吧,我们先看下HanziToPinyin的getInstance()方法:

publicstatic HanziToPinyin getInstance() {

synchronized(HanziToPinyin.class) {

if (sInstance !=null) {

return sInstance;

}

// Check if zh_CN collation data is available

final Locale locale[] = Collator.getAvailableLocales();

for (int i = 0; i

if (locale[i].equals(Locale.CHINA)) {

sInstance = new HanziToPinyin(true);

return sInstance;

}

}

Log.w(TAG, "There is no Chinese collator, HanziToPinyin is disabled");

sInstance = new HanziToPinyin(false);

return sInstance;

}

}

现在说下我的开发板为什么不能转拼音;就是因为final Locale locale[] = Collator.getAvailableLocales()的Locale没有一项equals(Locale.CHINA),所以到时候解决了这项,联系人的按拼音排序也就解决了,如果大家不想用系统自带的,自己可以下载个pinyin4j.jar包自己实现吧。

好吧,继续:

看方法名也只到,这个方法返回一个HanziToPinyin实例,我仔细研究了HanziToPinyin的构造方法,无论纯如的布尔值是false还是true都不影响,返回的都一样,只不过这个方法的Log.w(TAG, "There is no Chinese collator, HanziToPinyin is disabled");可以提示是否支持汉字转拼音,如果不能,android就会将displayname原封不动的插入sort_key里面,如果能,就是刚才我说的 如“你好”,sort_key则会显示“ni 你 hao 好”,这种形式,具体的如何转拼音就是get()方法拉,直接插代码:

public ArrayList get(final String input) {

ArrayList tokens = new ArrayList();

if (!mHasChinaCollator || TextUtils.isEmpty(input)) {

// return empty tokens.

return tokens;

}

finalint inputLength = input.length();

final StringBuilder sb =new StringBuilder();

int tokenType = Token.LATIN;

// Go through the input, create a new token when

// a. Token type changed

// b. Get the Pinyin of current charater.

// c. current character is space.

for (int i = 0; i

finalchar character = input.charAt(i);

if (character ==' ') {

if (sb.length() >0) {

addToken(sb, tokens, tokenType);

}

} elseif (character

if (tokenType != Token.LATIN && sb.length() >0) {

addToken(sb, tokens, tokenType);

}

tokenType = Token.LATIN;

sb.append(character);

} elseif (character

if (tokenType != Token.UNKNOWN && sb.length() >0) {

addToken(sb, tokens, tokenType);

}

tokenType = Token.UNKNOWN;

sb.append(character);

} else {

Token t = getToken(character);

if (t.type == Token.PINYIN) {

if (sb.length() >0) {

addToken(sb, tokens, tokenType);

}

tokens.add(t);

tokenType = Token.PINYIN;

} else {

if (tokenType != t.type && sb.length() >0) {

addToken(sb, tokens, tokenType);

}

tokenType = t.type;

sb.append(character);

}

}

}

if (sb.length() >0) {

addToken(sb, tokens, tokenType);

}

return tokens;

}

手机通讯录java首字母排序,Android联系人按拼音排序以及按汉字首字母或全拼搜索...相关推荐

  1. Android联系人按拼音排序以及按汉字首字母或全拼搜索

    转:http://blog.csdn.net/csuhanyong/article/details/6120935 今天用了整整一下午去捣鼓这块,为什么模拟器上可以按拼音排序,中英文混排,及按字母搜索 ...

  2. 【如何通过汉字首字母拼写查询数据】mysql数据库汉字首字母获取查询或通过ES插件elasticsearch-analysis-pinyin进行汉字首拼查询

    一.mysql数据库汉字首字母获取查询 1.汉字提取首字母 get_first_pinyin_char: 此函数是将一个中文字符串的第一个汉字转成拼音字母 (例如:"李"-> ...

  3. qq不显示我的android手机号码,QQ手机通讯录怎么设置不显示推荐联系人?

    手机QQ安卓版本更新以后,在好友列表中显示了一个手机通讯录,支持将绑定手机号码的QQ推荐给我们,如果我们的手机上存了这个人的手机号码,但是其实这样很容易让我们反感,怎么才能不显示这些推荐联系人呢?欢迎 ...

  4. 获取手机通讯录 (含SIM卡中的联系人)

    sim卡UIR content://icc/fdn content://sim/fdn MOTO XT800比较异常,通讯录在: content://contacts/phones 1.使用andro ...

  5. 关键字的首字母拼音和全拼搜索

    /*** @author ChineseSpelling* 所有全拼集合 汉字转拼音 使用工具类*/ public class ChineseSpelling {private static int[ ...

  6. [转] JS 排序(包括按中文拼音排序) Google到的好东西,收藏!

    转自:http://blog.csdn.net/sunyujia/ test.html <html><head><title></title><s ...

  7. layui 改写 table 排序,填加中文按照拼音排序

    因为layui table默认的排序不支持中文拼音,改写layui源码来完成我们的需求 注意在layui官网下载到的layui代码是压缩后的,这里需要下载layui的源码 layui源码地址: 码云地 ...

  8. android联系人中英文混合排序

    getContentResolver().query(...),最后一个sortOrder参数设置为" sort_key COLLATE LOCALIZED ASC" 测试2.1以 ...

  9. android自定义数字键盘和字母键盘,Android自定义键盘的实现(数字键盘和字母键盘)...

    Android自定义键盘的实现(数字键盘和字母键盘) 发布时间:2020-09-04 03:18:48 来源:脚本之家 阅读:100 作者:浪淘沙xud 在项目中,产品对于输入方式会有特殊的要求,需要 ...

最新文章

  1. Jupyter Notebook各种使用方法
  2. python是一种什么编程语言-想自学一种编程语言,各种编程语言都有什么区别?...
  3. 递归算法 流程图_什么是算法?如何学习算法?算法入门
  4. hadoop 实现数据排序
  5. python量化交易开源框架_hikyuu: 基于C++/Python的开源量化交易研究框架
  6. 基于jquery的tab切换
  7. python sdk怎么用_python - alipay sdk 使用 及 注意点
  8. 登录验证时第一次帐号密码错误,第二次提交出现错误404,Could not find action or result: /zyf_shop/user_login.action
  9. Java 汉字 转 拼音/首字母
  10. python批量修改Excel文件后缀csv为xlsx
  11. Android app资源监控
  12. 在软件测试面试中,碰到这些「送命题」,大牛教你一招应对
  13. 【Eclipse使用技巧】格式化代码的方法 + 解决注释是繁体字的方法
  14. 【FATE】==在Docker中部署FATE——单机版==
  15. 如何拦截烦人的视频广告
  16. Symfony5 系列教程1-安装并认识symfony
  17. 从键盘输入一个小写字母,转化为大写字母并输出。
  18. 数据规范化处理方法-Min-max 规范化和 Z-Score 规范化
  19. 【合泰HT3252352串口通信实验注意点】
  20. 欧尼酱讲JVM(21)——垃圾回收相关算法

热门文章

  1. 2020年免费远程控制软件排行出炉!网站监控免费下载有那些?
  2. 该如何从教育行业转行做IT——我的真实经历给出的偏门答案
  3. python入门程序有趣例子_10 个最值得 Python 新人练手的有趣项目
  4. 快学excel-VBA创建数据透视表
  5. Visual Studio Code入门笔记
  6. 向爱康投稿:读《浪潮之巅》,听潮起潮落
  7. 第八章 射频滤波器
  8. android局域网播放视频播放器,手机播放器播放局域网内电脑本地的视频
  9. TCP/IP协议及常见状态码说明(SYN,FIN,ACK,PSH,RST)
  10. 十分钟看懂图像语义分割技术