3种方式查询手机通讯录联系人
本文是提供了3种方式查询通讯录,获取手机通讯录中所有联系人的ID和联系人姓名。
- 通过ContentResolver类的query方法,这种方法在主线程中查询数据,query方法返回数据库的游标Cursor,需要自己去手动关闭。
- 通过Activity类的managedQuery方法,这种方法查询同样是在主线程中,但是不需要手动关闭Cursor,因为Activity类销毁时再onDestroy方法中会去关闭。
- 通过Android提供的异步查询框架AsyncQueryHandler,这个类是一个抽象类,提供异步查询,当查询完毕后,会调用onQueryComplete方法,该方法参数cursor是查询系统数据库完成后获得的游标。
实例代码1
通过ContentResolver类的query方式查询,例如:
@获取手机通讯录联系人ID和NAME
protected void getAllContacts() {
ContentResolver cr = this.getContentResolver();
Cursor cursor = cr.query(
ContactsContract.Contacts.CONTENT_URI, null, null, null,
ContactsContract.Contacts._ID + " DESC");
while(cursor.moveToNext()) {
System.out.println(cursor.getString(
cursor.getColumnIndexOrThrow(ContactsContract.Contacts._ID)));
System.out.println(cursor.getString(
cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)));
}
cursor.close();
}
实例代码2
通过Activity类的managedQuery方法
@获取手机通讯录联系人ID和NAME
private void getContacts(){
Cursor cursor = managedQuery(ContactsContract.Contacts.CONTENT_URI,
null,
null,
null,
null);
while (cursor.moveToNext()) {
System.out.println(
cursor.getString(cursor.getColumnIndexOrThrow(ContactsContract.Contacts._ID)));
System.out.println(
cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)));
}
}
实例代码3
通过AsyncQueryHandler
@获取手机通讯录联系人ID和NAME
private void getContactsAsync(){
MyQueryHandler qh = new MyQueryHandler(getContentResolver());
qh.startQuery(0, null, ContactsContract.Contacts.CONTENT_URI,
null,
null,
null,
null);
}
@自定义一个异步查询类,继承AsyncQueryHandler类
class MyQueryHandler extends AsyncQueryHandler{
public MyQueryHandler(ContentResolver cr) {
super(cr);
}
@Override
protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
super.onQueryComplete(token, cookie, cursor);
while(cursor.moveToNext()){
System.out.println(cursor.getString(
cursor.getColumnIndexOrThrow(ContactsContract.Contacts._ID)));
System.out.println(cursor.getString(
cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)));
}
cursor.close();
}
}