Chinaunix首页 | 论坛 | 博客
  • 博客访问: 343807
  • 博文数量: 26
  • 博客积分: 169
  • 博客等级: 入伍新兵
  • 技术积分: 516
  • 用 户 组: 普通用户
  • 注册时间: 2012-04-29 23:53
个人简介

爱工作,爱生活,更爱自由的程序媛,坚持最初的梦想,做最好的自己!

文章分类

全部博文(26)

文章存档

2014年(16)

2013年(3)

2012年(7)

我的朋友

分类: Android平台

2014-03-07 15:09:37

今天我要说的是获取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了,O(∩_∩)O哈哈~
  1.    Cursor c;

  2.     public ArrayList<ContactMember> getContact(Activity context) {
  3.         ArrayList<ContactMember> listMembers = new ArrayList<ContactMember>();
  4.         Cursor cursor = null;
  5.         try {
  6.          
  7.             Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
  8.              // 这里是获取联系人表的电话里的信息  包括:名字,名字拼音,联系人id,电话号码;
  9.             // 然后在根据"sort-key"排序
  10.             cursor = context.getContentResolver().query(
  11.                     uri,
  12.                     new String[] { "display_name", "sort_key", "contact_id",
  13.                             "data1" }, null, null, "sort_key");

  14.             if (cursor.moveToFirst()) {
  15.                 do {
  16.                     ContactMember contact = new ContactMember();
  17.                     String contact_phone = cursor
  18.                             .getString(cursor
  19.                                     .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
  20.                     String name = cursor.getString(0);
  21.                     String sortKey = getSortKey(cursor.getString(1));
  22.                     int contact_id = cursor
  23.                             .getInt(cursor
  24.                                     .getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));
  25.                     contact.contact_name = name;
  26.                     contact.sortKey = sortKey;
  27.                     contact.contact_phone = contact_phone;
  28.                     contact.setContact_id(contact_id);
  29.                     if (name != null)
  30.                         listMembers.add(contact);
  31.                 } while (cursor.moveToNext());
  32.                 c = cursor;
  33.             }
  34.         } catch (Exception e) {
  35.             e.printStackTrace();
  36.         } finally {
  37.             context = null;
  38.         }
  39.         return listMembers;
  40.     }




  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:这篇博文就到此为止了,如果大家有好的建议可以提出来,很高兴和大家分享。另外,为了调节字体大小颜色等花了我不少时间呢,果然太喜欢追求完美了…………


阅读(24934) | 评论(5) | 转发(0) |
给主人留下些什么吧!~~

jieliu7152016-04-27 15:16:39

public ArrayList<ContactMember> getContact(Activity context) //这儿要是调用它,需要给传什么?

蒋梦娜2015-03-17 09:21:57

非常厉害  希望能成为你这样的女程序媛

蒋梦娜2015-03-17 09:21:55

非常厉害  希望能成为你这样的女程序媛

perfectnihil2015-02-16 15:47:50

copy

hszfor2014-12-31 16:03:14

呵呵,很少有女程序媛呢,写的挺好,顶一个