我正在尝试获取电话簿中可见的联系人。假设我的设备中有5个保存号码的联系人,以及保存在我的Gmail帐户中的3个联系人号码。另外,请考虑设备联系人跨越Gmail联系人。以下方法输出所有8个联系人:
public void getContactList() {
contactList.clear();
Cursor phones = null;
try {
phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
while (phones.moveToNext())
{
String _name = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String _number = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
HashMap<String , String> contactMap= new HashMap<String, String>();
contactMap.put("NAME", _name);
contactMap.put("NUMBER", _number);
contactList.add(contactMap);
numbers.add("+" + _number);
Log.v("" + counter++, _number + " " + _name);
}
phones.close();
} catch ( Exception e ) {
// TODO: handle exception
}
finally {
if(phones != null){
phones.close();
}
}
}
但是,在类似的问题中,人们建议使用以下方法。该方法输出64行。换句话说,无论第一种方法返回什么,它都会循环8次:
public void getContactList() {
contactList.clear();
String phoneNum[] = null;
Cursor cur = null;
Cursor pCur = null;
try {
ContentResolver cr = getContentResolver();
cur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
int i = 0;
if (cur.getCount() > 0) {
phoneNum = new String[cur.getCount()];
while (cur.moveToNext()) {
String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
// get the phone number
pCur = cr.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
null,
null,
ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC");
while (pCur.moveToNext()) {
// int _id = i;
String _name = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
String _number = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
_number = _number.replaceAll("[\\D]", "");
HashMap<String , String> contactMap= new HashMap<String, String>();
contactMap.put("NAME", _name);
contactMap.put("NUMBER", _number);
contactList.add(contactMap);
phoneNum[i] = _number;
Log.v("" + counter++, _number + " " + _name);
}
pCur.close();
}
i++;
}
}
cur.close();
} catch ( Exception e ) {
// TODO: handle exception
}
finally {
if(pCur != null){
pCur.close();
}
if(cur != null){
cur.close();
}
}
}
如果人们建议第二种方法,他们应该考虑我没有注意到的一点。但是,我还没有发现这一点。当然,我无意无缘无故地再次联系我的联系人七次。为什么人们说第二种方法更好?这有什么好处或验证呢?
答案 0 :(得分:0)
如果您只想要所有可见联系人的DISPLAY_NAME和PHONE_NUMBER,那么您的方法就是完美的。
当您想要在单个数据结构中对联系人的多个电话号码进行分组时,第二种方法很有用,但您错过的是第二个查询也应该将联系人ID作为过滤器,否则您只是查询所有所有联系人的电话号码,而不是查询单个联系人的所有电话号码。