作为移动互联时代的代表, Android应用读取手机的系统联系人应该是很常见的需求. 网络上有很多关于读取方面的资料,介绍的比较全面,也比较好用.
一般的通用思路是先去把所有的联系人查出来,然后再根据联系人去查询各自的手机号:
ContentResolver reContentResolverol = getContentResolver();
Uri contactData = data.getData();
@SuppressWarnings("deprecation")
Cursor cursor = managedQuery(contactData, null, null, null, null);
cursor.moveToFirst();
username = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
Cursor phone = reContentResolverol.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId,
null,
null);
while (phone.moveToNext()) {
usernumber = phone.getString(phone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
}
但是当用户手机的联系人特别多的时候,这简直是个灾难.因为每个联系人都要单独再查询一次.比如有2000个联系人就需要再查询2000次.
在这推荐使用另外一种方法:
String[] projection = new String[]{ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER};
Cursor cursor = contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projection, null, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
if (cursor == null) {
return;
}
while (cursor.moveToNext()) {
String name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String number = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
}
把所有的电话号码全部查询出来,然后再手动把同一个联系人的电话合并起来.
经过测试4000联系人, 第一种方法的时间是3000ms. 6000联系人第二种方法是90ms.