【问题标题】:Best way to retrieve contact list检索联系人列表的最佳方法
【发布时间】:2017-11-23 07:23:53
【问题描述】:

我正在开发一个包含三个片段(callLog、contactList、favoriteContactList)的联系人应用程序。将一个片段移动到另一个片段时,检索所有联系人需要时间。我的设备上有大约 276 个联系人。任何减少时间的解决方案。

ContentResolver cr = getContext().getContentResolver();
        String[] projection = {ContactsContract.Contacts._ID,
                ContactsContract.Contacts.DISPLAY_NAME,
                ContactsContract.Contacts.PHOTO_URI,
                ContactsContract.Contacts.HAS_PHONE_NUMBER};

        Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, projection, null, null, ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " ASC");
        String id, name, image_uri, phone = "";

        if (cur != null && cur.getCount() > 0) {
            while (cur.moveToNext()) {

                id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
                name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                image_uri = cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_URI));

                Log.d(TAG, " name " + name + " id " + id);

                // phone number
                if (Integer.parseInt(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
                    Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?", new String[]{id}, null);
                    if (pCur != null && pCur.moveToNext()) {

                        phone = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                        int colIndex = pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE);
                        int lblIndex = pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.LABEL);
                        int labelType = pCur.getInt(colIndex);
                        String phoneType;

                        if (labelType == ContactsContract.CommonDataKinds.Phone.TYPE_CUSTOM) {
                            phoneType = pCur.getString(colIndex);
                        } else {
                            phoneType = String.valueOf(ContactsContract.CommonDataKinds.Phone.getTypeLabel(this.getResources(), labelType, "Mobile"));
                        }

                        Log.d(TAG, phoneType + " " + phone);
                        pCur.close();
                    }
                    mContactArrayList.add(new Contact(id, name, phone, image_uri));
                }
            }
            cur.close();
        }

【问题讨论】:

  • 在单独的线程(AsyncTask)上调用此方法。

标签: android android-contacts


【解决方案1】:

试试这个代码

Cursor 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 phone = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
        String id = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));
        String image_uri = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.PHOTO_URI));

        mContactArrayList.add(new Contact(id, name, phone, image_uri));

    }

我认为它有效。

【讨论】:

  • 它可以工作,但有时光标会返回重复值。
  • 是的,因为它会从您的联系人数据库中获取所有联系人。这就是为什么
  • 这将在数据库中为每个电话号码返回一个项目,而不是每个联系人。您需要将 mContactArrayList 更改为 HashMap,并将同一联系人的多个电话号码添加到同一联系人对象中,请参阅此答案:stackoverflow.com/a/46594049/819355
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多