您的位置:首页 > 移动开发 > Android开发

Android 获取系统联系人并排序

2016-01-21 15:45 453 查看
今天我要说的是获取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”的解释,是不是很详细呢,如果大家还想要获取联系人其他的信息,那么都可以在这里面找到。

/**
* Sort key that takes into account locale-based traditions for sorting
* names in address books. The default
* sort key is {@link #DISPLAY_NAME_PRIMARY}. For Chinese names
* the sort key is the name's Pinyin spelling, and for Japanese names
* it is the Hiragana version of the phonetic name.
*/
public static final String SORT_KEY_PRIMARY = "sort_key";
5、以下就是获取联系人的具体代码,写完之后,终于把以前繁杂的代码去掉了,有种神清气爽的感觉。以后大家要是有这个需求的话,直接就可以copy了,O(∩_∩)O哈哈~

Cursor c;

public ArrayList<ContactMember> getContact(Activity context) {
ArrayList<ContactMember> listMembers = new ArrayList<ContactMember>();
Cursor cursor = null;
try {

Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
// 这里是获取联系人表的电话里的信息  包括:名字,名字拼音,联系人id,电话号码;
// 然后在根据"sort-key"排序
cursor = context.getContentResolver().query(
uri,
new String[] { "display_name", "sort_key", "contact_id",
"data1" }, null, null, "sort_key");

if (cursor.moveToFirst()) {
do {
ContactMember contact = new ContactMember();
String contact_phone = cursor
.getString(cursor
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
String name = cursor.getString(0);
String sortKey = getSortKey(cursor.getString(1));
int contact_id = cursor
.getInt(cursor
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));
contact.contact_name = name;
contact.sortKey = sortKey;
contact.contact_phone = contact_phone;
contact.setContact_id(contact_id);
if (name != null)
listMembers.add(contact);
} while (cursor.moveToNext());
c = cursor;
}
} catch (Exception e) {
e.printStackTrace();
} finally {
context = null;
}
return listMembers;
}


/**
* 获取sort key的首个字符,如果是英文字母就直接返回,否则返回#。
*
* @param sortKeyString
* 数据库中读取出的sort key
* @return 英文字母或者#
*/
private static String getSortKey(String sortKeyString) {
String key = sortKeyString.substring(0, 1).toUpperCase();
if (key.matches("[A-Z]")) {
return key;
}
return "#";
}


我为什么要拿这个出来比较呢?其实是想说

1、没有哪个人从一开始就知道怎样的技术就是最好的。

2、对Android里面的那些数据库的参数不熟悉,说白了,就是不熟悉Android机制。

3、即使之前有方法解决了这个问题,但是如果碰到更好的方式就不应该固步自封,而在于勇于尝试。

4、在不停的完善自己的同时,也渐渐暴露了自己的很多缺陷,然后才更清楚以后的自己应该怎么样去做。

5、多去技术型的博客溜达溜达,看看有什么新的技术介绍,如果有的话,可以自己开始做。

6、养成多看系统源码的习惯,很多我们不明白的问题在那里会有解答。

转自:http://blog.chinaunix.net/uid-26930580-id-4137246.html
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: