不使用pinyin4j, 通过字符串截取手段快速查询通讯录联系人的拼音(包括全拼和简拼)
刚开始我也是使用pinyin4j但是速度太慢8分钟还加载不完我的280个联系人数据,所以我选择另谋出路。发现有个字段包含拼音,“ContactsContract.CommonDataKinds.Phone.SORT_KEY_PRIMARY”,就是这个字段,但是是很变态的拼音,比如姓名为“成龙”这个联系人的这个字段的值是”CHENG 成 LONG 龙”注意里面都有空格,而且拼音都为大写,
再比如“liu德华”字段值为”lzizuz DE 德 HUA 华”,非中文后面都会加上”z”,让我很难过,本来想着直接截取的,这样使我的截取方式变得困难。事在人为嘛,看过”最强大脑“明显脑子好用了点,想到了办法。具体请看代码。很简单,有问题再问我
public static List<contact> getAllContacts(Context context) {
List<contact> list = new ArrayList<contact>();
ContentResolver resolver = context.getContentResolver();
Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
String[] projection = new String[] {
ContactsContract.CommonDataKinds.Phone.NUMBER,// 电话号码
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,// 用户名
ContactsContract.CommonDataKinds.Phone.SORT_KEY_PRIMARY,
//ContactsContract.CommonDataKinds.Phone.CONTACT_ID // 联系人id
};
String selection = null;
String[] selectionArgs = null;
String sortOrder = ContactsContract.CommonDataKinds.Phone.SORT_KEY_PRIMARY;
Cursor cursor = null;
try {
cursor = resolver.query(uri, projection, selection,
selectionArgs,sortOrder);
if (cursor != null && cursor.getCount() > 0) {
while (cursor.moveToNext()) {
String number = cursor.getString(0);// 电话号码
String name = cursor.getString(1);
String sortPinYin = cursor.getString(2);
contact object = new contact();
String numNoSpace = number.replaceAll(" ","").replaceAll("-","");
object.setNumber(numNoSpace);
object.setName(name);
String[] fullShortPinYin = getFullShortPinYin(name, sortPinYin);
object.setFullPinyin(fullShortPinYin[0]);
object.setShortpinyin(fullShortPinYin[1]);
list.add(object);
}
}
} finally {
if (cursor != null) {
cursor.close();
}
}
return list;
}
private static String[] getFullShortPinYin(String name,String sortPinYin) {
String [] fullShortPinYin = new String[2];
char[] chars = name.toCharArray();
StringBuilder fullPin = new StringBuilder();
StringBuilder shortPin = new StringBuilder();
for (int i = 0; i < chars.length; i++) {
String anStr = String.valueOf(chars[i]);
if (anStr.matches("[\\u4e00-\\u9fa5]")){
String rep = " [A-Z]+ " + anStr + "|" + "\\s*[A-Z]+ " + anStr;
Pattern pattern = Pattern.compile(rep);
Matcher matcher = pattern.matcher(sortPinYin);
if (matcher.find()){
String findStr = matcher.group().trim();
String resutlStr = findStr.split(" ")[0];
fullPin.append(resutlStr);
shortPin.append(resutlStr.substring(0,1));
}
}else {
fullPin.append(chars[i]);
shortPin.append(chars[i]);
}
}
fullShortPinYin[0] = fullPin.toString().toLowerCase();
fullShortPinYin[1] = shortPin.toString().toLowerCase();
return fullShortPinYin;
}
各位:经过测试,以上方法并不适合所有手机,找到一个通用而且快速的方法。
用tinyPinyin