今天我要说的是获取Android手机里面联系人并按自己进行排序
的方法。
在说这个之前,我只能说之前的自己真的很傻,为什么这么说呢,请大家看看之前的我是怎么做的?
之前的我:首先是通过获取系统的联系人,将名字转换成汉语拼音(在这个过程还用到了汉语拼音转换包),然后获取首字母进行排序,结果就是功能是实现了,但是相当复杂
。
后来的我:直接在获取联系人的时候,也获取到了名字的拼音的拼写,然后自动排序。
那么下面我就开始上代码:
首先声明几点:
1、ContactMember
是我自己的实例类,里面有:
public String contact_name;
public String contact_phone;
public int contact_id;
public String sortKey;
2、其次我们看到的URI是个很关键的东西,Android中提供ContentProvider实现数据共享,那么怎样获取这些数据呢,就是通过URI得到要访问的数据。
除了联系人,还有媒体库中的音乐啦、图片啦、视频啦都是这样获得的。如果大家有兴趣的话可以去看下。
并且我将在之后的博客中再写一下音乐、图片、视频的获取,方便大家阅读。
3、Cursor:这个称之为游标的东西,很管用的。通过它,我们可以获取数据库中的东西。但是有一点,大家千万要记住,用完之后一定要记得关闭。
不然会造成内存泄露等问题,后果很严重哦。
4、如果大家感兴趣的话,可以去ContactsContract
.
CommonDataKinds
.
Phone里的源码里看看,里面有很多解释,那么现在呢,我带大家示范性的看下。
下面这段代码就是对“sort_key”的解释,是不是很详细呢,如果大家还想要获取联系人其他的信息,那么都可以在这里面找到。
1. /**
2. * Sort key that takes into account locale-based traditions for sorting
3. * names in address books. The default
4. * sort key is {@link #DISPLAY_NAME_PRIMARY}. For Chinese names
5. * the sort key is the name's Pinyin spelling, and for Japanese names
6. * it is the Hiragana version of the phonetic name.
7. */
8. public static final String SORT_KEY_PRIMARY = "sort_key";
5、以下就是获取联系人的具体代码 ,写完之后,终于把以前繁杂的代码去掉了,有种神清气爽的感觉。以后大家要是有这个需求的话,直接就可以copy了
1. Cursor c;
2.
3. public ArrayList<ContactMember> getContact(Activity context) {
4. ArrayList<ContactMember> listMembers = new ArrayList<ContactMember>();
5. Cursor cursor = null;
6. try {
7.
8. Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
9. // 这里是获取联系人表的电话里的信息 包括:名字,名字拼音,联系人id,电话号码;
10. // 然后在根据"sort-key"排序
11. cursor = context.getContentResolver().query(
12. uri,
13. new String[] { "display_name", "sort_key", "contact_id",
14. "data1" }, null, null, "sort_key");
15.
16. if (cursor.moveToFirst()) {
17. do {
18. = new ContactMember();
19. String contact_phone = cursor
20. .getString(cursor
21. .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
22. String name = cursor.getString(0);
23. String sortKey = getSortKey(cursor.getString(1));
24. int contact_id = cursor
25. .getInt(cursor
26. .getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));
27. .contact_name = name;
28. .sortKey = sortKey;
29. .contact_phone = contact_phone;
30. .setContact_id(contact_id);
31. if (name != null)
32. .add(contact);
33. } while (cursor.moveToNext());
34. = cursor;
35. }
36. } catch (Exception e) {
37. .printStackTrace();
38. } finally {
39. context = null;
40. }
41. return listMembers;
42. }
1. /**
2. * 获取sort key的首个字符,如果是英文字母就直接返回,否则返回#。
3. *
4. * @param sortKeyString
5. * 数据库中读取出的sort key
6. * @return 英文字母或者#
7. */
8. private static String getSortKey(String sortKeyString) {
9. String key = sortKeyString.substring(0, 1).toUpperCase();
10. if (key.matches("[A-Z]")) {
11. return key;
12. }
13. return "#";
14. }
我为什么要拿这个出来比较呢?其实是想说
1、没有哪个人从一开始就知道怎样的技术就是最好的。
2、对Android里面的那些数据库的参数不熟悉,说白了,就是不熟悉Android机制。
3、即使之前有方法解决了这个问题,但是如果碰到更好的方式就不应该固步自封,而在于勇于尝试。
4、在不停的完善自己的同时,也渐渐暴露了自己的很多缺陷,然后才更清楚以后的自己应该怎么样去做 。
5、多去技术型的溜达溜达,看看有什么新的技术介绍,如果有的话,可以自己开始做。
6、养成多看系统源码的习惯,很多我们不明白的问题在那里会有解答。
PS:这篇博文就到此为止了,如果大家有好的建议可以提出来,很高兴和大家分享。