访问 Android 联系人组名称

Posted

技术标签:

【中文标题】访问 Android 联系人组名称【英文标题】:Accessing Android Contact Group Names 【发布时间】:2011-05-19 02:11:58 【问题描述】:

您能告诉我如何以编程方式获取 联系人组 存储在我们的安卓手机中?

【问题讨论】:

【参考方案1】:
final String[] GROUP_PROJECTION = new String[] 
            ContactsContract.Groups._ID, ContactsContract.Groups.TITLE ;
    cursor = getContentResolver().query(
    ContactsContract.Groups.CONTENT_URI, GROUP_PROJECTION, null,
            null, ContactsContract.Groups.TITLE);

            GlobalConfig.groupList.clear();
    Group g = new Group();
    g.GroupIdList += "0";
    g.setGroupTitle("ALL");
    GlobalConfig.groupList.add(g);
    while (cursor.moveToNext()) 

        String id = cursor.getString(cursor
                .getColumnIndex(ContactsContract.Groups._ID));

        String gTitle = (cursor.getString(cursor
                .getColumnIndex(ContactsContract.Groups.TITLE)));

        if (gTitle.contains("Group:")) 
            gTitle = gTitle.substring(gTitle.indexOf("Group:") + 6).trim();

        
        if (gTitle.contains("Favorite_")) 
            gTitle = "Favorites";
        
        if (gTitle.contains("Starred in android")
                || gTitle.contains("My Contacts")) 
            continue;
        

        Group gObj = new Group();

        int pos = GlobalConfig.GroupContainsTitle(gTitle);
        if (pos != -1) 
            gObj = GlobalConfig.groupList.get(pos);
            gObj.GroupIdList += "," + id;
            GlobalConfig.groupList.set(pos, gObj);

         else 
            gObj.GroupIdList += id;
            gObj.setGroupTitle(gTitle);
            GlobalConfig.groupList.add(gObj);

        

        // Log.d("GrpId  Title", gObj.getGroupIdList() +
        // gObj.getGroupTitle());
    

【讨论】:

这是我的问题的完美解决方案。但是,在这里我不了解 GlobalConfig 类的使用以及它存储给定 GroupContainsTitle 的方式。所以@Abhishek 你可以澄清更多关于 GlobalConfig 类的信息。这会节省我的时间。 @prativa GlobalConfig 只是一个简单的静态类,用于存储可在整个应用程序中访问的静态集合。 完美!为什么我会得到更多相同的组?我得到例如3 位同事和 2 位朋友。 可能是电话之一、sim 之一和 gmail 联系人之一【参考方案2】:

@Abhi 的回答还可以,但有一些限制:

将列出已删除的联系人 将列出不可见的组 将列出“幽灵”组(即本应删除但仍处于不确定状态的组)

-

private class GroupInfo 
    String id;
    String title;

    @Override
    public String toString() 
        return title+ " ("+id+")";
    

    public String getId() 
        return id;
    


List<GroupInfo> groups = new ArrayList<GroupInfo>();

public void loadGroups() 
   final String[] GROUP_PROJECTION = new String[] 
            ContactsContract.Groups._ID, 
            ContactsContract.Groups.TITLE,
            ContactsContract.Groups.SUMMARY_WITH_PHONES
            ;

    Cursor c = getContentResolver().query(
            ContactsContract.Groups.CONTENT_SUMMARY_URI,
            GROUP_PROJECTION,
            ContactsContract.Groups.DELETED+"!='1' AND "+
            ContactsContract.Groups.GROUP_VISIBLE+"!='0' "
            ,
            null,
            null);
    final int IDX_ID = c.getColumnIndex(ContactsContract.Groups._ID);
    final int IDX_TITLE = c.getColumnIndex(ContactsContract.Groups.TITLE);

    Map<String,GroupInfo> m = new HashMap<String, GroupInfo>();

    while (c.moveToNext()) 
        GroupInfo g = new GroupInfo();
        g.id = c.getString(IDX_ID);
        g.title = c.getString(IDX_TITLE);
        int users = c.getInt(c.getColumnIndex(ContactsContract.Groups.SUMMARY_WITH_PHONES));
        if (users>0) 
            // group with duplicate name?
            GroupInfo g2 = m.get(g.title);
            if (g2==null) 
                m.put(g.title, g);
                groups.add(g);
             else 
                g2.id+=","+g.id;
            
        
    
    c.close();
  

【讨论】:

【参考方案3】:

不需要过时的旧答案。这里的解决方案要简单得多。

final String[] GROUP_PROJECTION = new String[] 
            ContactsContract.Groups._ID, ContactsContract.Groups.TITLE ;
Cursor gC = getContentResolver().query(
            ContactsContract.Groups.CONTENT_URI, GROUP_PROJECTION,null,null,null);
gC.moveToFirst();
while (!gC.isAfterLast()) 
        int idcolumn = gC.getColumnIndex(ContactsContract.Groups.TITLE);
        String Id = gC.getString(idcolumn);
        ArrayL.add(Id);
        gC.moveToNext();

        LinkedHashSet<String> s = new LinkedHashSet<String>();
        s.addAll(ArrayL);
        ArrayL.clear();
        ArrayL.addAll(s);

【讨论】:

谢谢伙计!这个比较简单。 “ArrayL”从何而来?

以上是关于访问 Android 联系人组名称的主要内容,如果未能解决你的问题,请参考以下文章

Android 来自组和图像的多个联系人

从android中的指定组获取联系人

Android 联系人应用程序上联系人的默认帐户类型/名称是啥?

Android:我正在尝试根据他们的显示名称搜索联系人

Android:联系人列表不按名称排序

如何从 Android 联系人中的联系人 ID 获取只读帐户名称