主要通過ContactsContract.CommonDataKinds.Phone.CONTENT_URI快速讀取全部數據, 直接讀取數據庫中的數據並按拼音排序( 不過按拼音排序只支持api11以上的)
讀取名字使用了contact表中的顯示
沒怎麼寫過文章 就直接上代碼了
public List<SysContact> queryContactsQuicly() {
Map<Integer, String> IdNameMap = new HashMap<Integer, String>();
// 讀取所有姓名和id
long begintime = System.currentTimeMillis();
Cursor cursor = MyApp.myApp.getContentResolver().query(
ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
if ((cursor != null) && (cursor.getCount() > 0)) {
cursor.moveToFirst();
int total = cursor.getCount();
Log.i("vvt", "讀取所有姓名和id total:" + total);
int displayNameIndex = cursor
.getColumnIndex(PhoneLookup.DISPLAY_NAME);
int contactIdIndex = cursor
.getColumnIndex(ContactsContract.Contacts._ID);
cursor.moveToFirst();
for (int i = 0; i < total; i++) {
String displayName = cursor.getString(displayNameIndex);
int cid = cursor.getInt(contactIdIndex);
// o.i("vvt","getContact_compare displayname:"+displayName+" id:"+cid);
IdNameMap.put(cid, displayName);
cursor.moveToNext();
}
}
cursor.close();
long endtime0 = System.currentTimeMillis();
Log.i("vvt", "讀取所有name use:" + (endtime0 - begintime) + "毫秒");
// 讀取所有號碼
// ////////////////////////////////////////////////////////////////////////////////
Map<Integer, Integer> contactMap = new HashMap<Integer, Integer>();
List<SysContact> tlist = new ArrayList<SysContact>();
Cursor phones = MyApp.myApp.getContentResolver().query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null,
null, ContactsContract.CommonDataKinds.Phone.SORT_KEY_PRIMARY);
if (phones != null) {
int phonecount = phones.getCount();
int numberIndex = phones
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
int contactidIndex = phones
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID);
int pinyinIndex=phones
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.SORT_KEY_PRIMARY);
int nameIndex = phones
.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
phones.moveToFirst();
Log.i("vvt", " phonecount:" + phonecount);
for (int j = 0; j < phonecount; j++) {
String num = phones.getString(numberIndex);
int id = phones.getInt(contactidIndex);
String name = phones.getString(nameIndex);
String pinyin = phones.getString(pinyinIndex);
if (num != null && !"null".equals(num) && num.length() > 0) {
num = num.trim().replace("-", "");
if (num.contains(" ")) {
num = num.replace(" ", "");
}
SysContact user = new SysContact();
String name0=IdNameMap.get(id);
Log.i("vvt","id:"+id+" name:"+name+" num:"+num+" name0:"+name0+" pinyin:"+pinyin);
//這裏使用contact表中的name
if(!TextUtils.isEmpty(name0)){
name=name0;
}
user.setName(name);
user.setContactid(id);
user.setPinyin(pinyin);
user.setPhone(num);
user.addNum(num);
if (contactMap.get(id) == null) {
List<String> numlist = new ArrayList<String>();
numlist.add(num);
//numMap.put(id, numlist);
tlist.add(user);
contactMap.put(id, tlist.size()-1);
} else {
//numMap.get(id).add(num);
int index=contactMap.get(id).intValue();
Log.i("vvt","index:"+index+" tlistsize:"+tlist.size());
tlist.get(index).addNum(num);
}
}
phones.moveToNext();
}
}
phones.close();
long endtime1 = System.currentTimeMillis();
Log.i("vvt", "讀取所有號碼耗時:" + (endtime1 - endtime0) + "毫秒");
long endtime2 = System.currentTimeMillis();
Log.i("vvt", "獲取全部聯繫人耗時:" + (endtime2 - begintime) + "毫秒"+" tlist size:"+tlist.size());
return tlist;
}
這是用到的bean
public class SysContact {
private int contactid ;
public int getContactid() {
return contactid;
}
public void setContactid(int contactid) {
this.contactid = contactid;
}
private String Name = "";
private String Phone = "";
private String HomePhone = "";
private String Company = "";
private String pinyin = "";
private String sortkey = "";
private HashSet<String> phoneList =new HashSet<String>() ;
public String getSortkey() {
return sortkey;
}
public void setSortkey(String sortkey) {
this.sortkey = sortkey;
}
public String getName() {
return Name;
}
public void setName(String name) {
Name = name;
}
public String getPhone() {
return Phone;
}
public void setPhone(String phone) {
Phone = phone;
}
public String getHomePhone() {
return HomePhone;
}
public void setHomePhone(String homePhone) {
HomePhone = homePhone;
}
public String getCompany() {
return Company;
}
public void setCompany(String company) {
Company = company;
}
public String getPinyin() {
return pinyin;
}
public void setPinyin(String pinyin) {
this.pinyin = pinyin;
}
public void addNum(String num){
if(TextUtils.isEmpty(num)) return;
phoneList.add(num);
}
}