代码之家  ›  专栏  ›  技术社区  ›  Zaid Mirza

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

  •  1
  • Zaid Mirza  · 技术社区  · 7 年前

    我在网上显示联系人 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 柱以下代码过滤器基于 账户类型

    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")));
    
            }
    

    问题是 Samsung GT-l9082 给出sim卡“sim帐户”和手机“本地电话帐户”的值,但当我在上进行测试时 Galaxy J5 它显示不同的值 账户类型

    1 回复  |  直到 7 年前
        1
  •  1
  •   marmor    7 年前

    这不是我们要走的路。

    CommonDataKinds.Phone.CONTENT_URI 是一张桌子 在Contacts DB中,不是Contacts。 因此,即使你只过滤到一个帐户,如果一个联系人包含多个电话,它也会在你的列表中出现两次。

    CursorLoader 范例(实际上很糟糕,无论如何我都不会使用它)。

    而是对 Phones.CONTENT_URI HashMap 从…起 CONTACT_ID 到列表 NUMBER s、 然后在地图中每个项目显示一行,你就可以访问该联系人的手机列表进行显示。

    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