使用ContactsContract获取联系人的最佳方式

时间:2015-08-28 18:07:53

标签: android contact contactscontract

我正在尝试获取电话簿中可见的联系人。假设我的设备中有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();
        }
    }
}

如果人们建议第二种方法,他们应该考虑我没有注意到的一点。但是,我还没有发现这一点。当然,我无意无缘无故地再次联系我的联系人七次。为什么人们说第二种方法更好?这有什么好处或验证呢?

1 个答案:

答案 0 :(得分:0)

如果您只想要所有可见联系人的DISPLAY_NAME和PHONE_NUMBER,那么您的方法就是完美的。

当您想要在单个数据结构中对联系人的多个电话号码进行分组时,第二种方法很有用,但您错过的是第二个查询也应该将联系人ID作为过滤器,否则您只是查询所有所有联系人的电话号码,而不是查询单个联系人的所有电话号码。