通过从RawContacts过滤account_type列来显示联系人

时间:2017-09-12 10:31:54

标签: android android-contacts android-cursor

我在RecyclerView及以下代码检索联系人

上显示联系人
 Uri Contact_URI=ContactsContract.CommonDataKinds.Phone.CONTENT_URI;


            return  new CursorLoader(getActivity(),Contact_URI,null,null,null,Build.VERSION.SDK_INT
                    >= Build.VERSION_CODES.HONEYCOMB ?
                    ContactsContract.Contacts.DISPLAY_NAME_PRIMARY :
                    ContactsContract.Contacts.DISPLAY_NAME+ "ASC");

但是有些联系人会多次显示,因此我决定在account_type列上过滤联系人。下面的代码过滤器基于account_type

if(list.getString(list.getColumnIndex("account_type")).equals("Local Phone Account") || list.getString(list.getColumnIndex("account_type")).equals("SIM Account") ) {

            textView.setText(list.getString(list.getColumnIndex(Build.VERSION.SDK_INT
                    >= Build.VERSION_CODES.HONEYCOMB ?
                    ContactsContract.Contacts.DISPLAY_NAME_PRIMARY :
                    ContactsContract.Contacts.DISPLAY_NAME)));
            number.setText(list.getString(list.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)));
        number.setText(list.getString(list.getColumnIndex("account_type")));

        }

问题是SIM卡和手机通讯录的account_type值因设备而异。在Samsung GT-l9082中为sim" Sim Account"提供了值。和电话"本地电话帐户"但是当我在Galaxy J5上对其进行测试时,它会针对SIM卡和手机通讯录显示针对account_type的不同值。我想只显示模拟和电话联系人

1 个答案:

答案 0 :(得分:1)

这不是要走的路。

CommonDataKinds.Phone.CONTENT_URI是联系人数据库中所有手机的表格,而非联系人。 因此,即使您只过滤一个帐户,如果联系人包含多个电话,它也会在您的列表中出现两次。

如果您只想在每个联系人中显示一行,但仍需要在主列表中显示手机,则无法使用CursorLoader范例(实际情况很糟糕,我不会&#39 ;无论如何都要使用它。)

而是对Phones.CONTENT_URI表中的所有项目运行简单查询,并从HashMap创建CONTACT_IDNUMBER列表,然后显示一个地图中每个项目的行,您可以访问该联系人的手机列表以及显示。

Map<String, List<String>> contacts = new HashMap<String, List<String>>();

String[] projection = { Phone.CONTACT_ID, Phone.DISPLAY_NAME, Phone.NUMBER };
Cursor cur = cr.query(Phone.CONTENT_URI, projection, null, null, null);

while (cur != null && cur.moveToNext()) {
    long id = cur.getLong(0);
    String name = cur.getString(1);
    String data = cur.getString(2); // the actual info, e.g. +1-212-555-1234

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

    // add info to existing list if this contact-id was already found, or create a new list in case it's new
    String key = id + " - " + name;
    List<String> infos;
    if (contacts.containsKey(key)) {
        infos = contacts.get(key);
    } else {
        infos = new ArrayList<String>();
        contacts.put(key, infos);
    }
    infos.add(data);
}

// now you can iterate over the 'contacts' map to display all contacts