【问题标题】:Filter contacts except groups of account type过滤除帐户类型组之外的联系人
【发布时间】:2013-05-29 09:55:09
【问题描述】:

我需要构建一个联系人选择器,其中列出了除帐户类型的联系人之外的所有手机联系人。 我确实遵循了这种方式: 例如,我要从列表中删除的帐户类型是:group = "com.account.myaccount"

首先我查询所有组 id 有帐户类型:

    public String[] getGroupIds(Context context, String group){
    
    final Cursor groupCursor = context.getContentResolver().query(
            GroupWrap.CONTENT_URI,
            GroupWrap.PROJECTION,
            GroupWrap.SELECTION_GROUP_ID,
            new String[]{group},
            null);

    String[] ids = new String[groupCursor.getCount()];
    int i = 0;
    final int contactNumberColumnType   = groupCursor.getColumnIndex(GroupWrap.COLUMN_TYPE); 
    final int contactNumberColumnIndex  = groupCursor.getColumnIndex(GroupWrap.COLUMN_ID);
    
    
    while (groupCursor.moveToNext()) {
        ids[i++] = Integer.toString(groupCursor.getInt(contactNumberColumnIndex));
        
        Log.v(TAG, " account type : " + groupCursor.getString(contactNumberColumnType)
                 + " : ids[]" + groupCursor.getInt(contactNumberColumnIndex)); 
                 
    }
    
    

    return ids;
}

final private static class GroupWrap {

    private GroupWrap() {
    }

    public static final String[] PROJECTION =
            new String[] {Groups.ACCOUNT_TYPE, Groups._ID};

    public static final String COLUMN_TYPE = Groups.ACCOUNT_TYPE;
    public static final String COLUMN_ID = Groups._ID;
    public static final Uri CONTENT_URI = Groups.CONTENT_URI;
    public static final String SELECTION_OTHER_GROUP_ID = GroupWrap.COLUMN_TYPE + "!=?";
    public static final String SELECTION_GROUP_ID = GroupWrap.COLUMN_TYPE + "=?";
}

然后我查询除组之外的所有联系人:

    public  Cursor getContactGroupIDs(String[] groupIds, Context context){
    
    String selection = ContactsQuery.COLUMN_NAME + " NOTNULL) AND ("

            + ContactsQuery.COLUMN_NAME + " !='' ) AND ";

    StringBuffer buffer = new StringBuffer(selection); 

    for(int i = 0; i < groupIds.length; i++){
        buffer.append(" (" + GroupMembership.GROUP_ROW_ID + " !=?) AND ");
    }


    // remove " ) AND "
    if(buffer.length() > 0){
        buffer.delete(buffer.length() - 6, buffer.length());
    }

    
    selection = buffer.toString();
    
    Log.v(TAG, "selection : " + selection);
    
    String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC";
    
    Cursor cursor = context.getContentResolver().query(ContactsQuery.CONTENT_URI, 
            ContactsQuery.PROJECTION, selection, groupIds, sortOrder);
    
    return cursor;
}


final public static class ContactsQuery {

    private ContactsQuery() {
        
    }

    public static final String COLUMN_NAME = Data.DISPLAY_NAME;
    public static final String COLUMN_ID = Data._ID;
    public static final String COLUMN_CONTACT_ID = Data.CONTACT_ID;
    public static final Uri CONTENT_URI = Data.CONTENT_URI;
    
    public static final String[] PROJECTION =
            new String[] {COLUMN_NAME, COLUMN_CONTACT_ID};

}

并结合所有:

    public List<PickerContactRow> getContactExceptGroup(Context context, String group){
    String[] groupIds = getGroupIdsExcept(context, group);
    List<PickerContactRow> result = new ArrayList<PickerContactRow>();
    
    Set<Long> seen = new HashSet<Long>();
    
    Cursor cursor = this.getContactGroupIDs(groupIds, context);
    
    
    int indexOfContactId = cursor.getColumnIndex(ContactsQuery.COLUMN_CONTACT_ID);
    int indexOfName = cursor.getColumnIndex(ContactsQuery.COLUMN_NAME);

    
    while (cursor.moveToNext()) {
        long contactID = cursor.getLong(indexOfContactId);
        if (!seen.contains(contactID)) {// remove duplicate contact
            seen.add(contactID);
            PickerContactRow contactRow = new PickerContactRow();
            contactRow.setId(contactID);
            contactRow.setName(cursor.getString(indexOfName));
            
            Log.v(TAG, "row : " + contactRow); 
                    //+ "group : " + cursor.getString(columnGroup));
            
            result.add(contactRow);
        }
    }
    
    return result;
}

问题是显示了一些奇怪的帐户名。一些电子邮件而不是帐户名。 看我的图片:

请帮我解决问题。或者您有任何其他方法来过滤帐户。 我正在寻找可以使用 CursorAdapter 的解决方案。我的方法不能使用 CursorAdapter。

【问题讨论】:

    标签: android android-listview android-contentprovider


    【解决方案1】:

    我自己解决了。 我确实是这样流动的:

    public  Cursor getContactGroupIDs(String acountType, Context context){
    
        String sortOrder = ContactsQuery.COLUMN_NAME + " COLLATE LOCALIZED ASC";
    
        Cursor cursor = context.getContentResolver().query(ContactsQuery.CONTENT_URI, 
                ContactsQuery.PROJECTION, ContactsQuery.SELECTION , null, sortOrder);
    
        return cursor;
    }
    
    private boolean isAccountType(Context context, String accountType, long id){
        Cursor cursor = context.getContentResolver().query(RawContactsQuery.CONTENT_URI, 
                RawContactsQuery.PROJECTION, RawContactsQuery.SELECTION , new String[]{id + "", accountType}, null);
        boolean result = cursor.getCount() > 0;
        cursor.close();
        return result;
    }
    
    public List<PickerContactRow> getContactExceptGroup(Context context, String accountType){
        List<PickerContactRow> result = new ArrayList<PickerContactRow>();
    
        Cursor cursor = this.getContactGroupIDs(accountType, context);
        EmailValidator validator = new EmailValidator();
    
        int indexOfContactId = cursor.getColumnIndex(ContactsQuery.COLUMN_CONTACT_ID);
        int indexOfName = cursor.getColumnIndex(ContactsQuery.COLUMN_NAME);
        final int columnGroup   = cursor.getColumnIndex(ContactsQuery.DELETED);
    
        while (cursor.moveToNext()) {
            long id = cursor.getLong(indexOfContactId);
            if (!isAccountType(context, accountType, id)) 
            {
                //seen.add(contactID);
                PickerContactRow contactRow = new PickerContactRow();
                contactRow.setId(id);
                contactRow.setName(cursor.getString(indexOfName));
    
                Log.v(TAG, "row : " + contactRow
                        + " value : " + cursor.getString(columnGroup));
    
    
    
                result.add(contactRow);
            }
        }
        cursor.close();
        return result;
    }
    
    
    final public static class ContactsQuery {
    
        private ContactsQuery() {
    
        }
    
        public static final String COLUMN_NAME = Contacts.DISPLAY_NAME;
        public static final String COLUMN_ID = Contacts._ID;
        public static final String DELETED = Contacts.HAS_PHONE_NUMBER;
        public static final String COLUMN_CONTACT_ID =  Contacts._ID;
        public static final Uri CONTENT_URI = Contacts.CONTENT_URI;
        public static final String SELECTION = COLUMN_NAME + " NOTNULL"
                + ") AND (" + COLUMN_NAME + " !=''"
                 + ") AND (" + Contacts.HAS_PHONE_NUMBER + " =1";
    
    
        public static final String[] PROJECTION =
                new String[] {COLUMN_NAME, COLUMN_CONTACT_ID, DELETED};
    
    }
    
    
    final public static class RawContactsQuery {
    
        private RawContactsQuery() {
    
        }
    
        public static final String ACCOUNT_TYPE = RawContacts.ACCOUNT_TYPE;
        public static final String COLUMN_CONTACT_ID = RawContacts.CONTACT_ID;
        public static final Uri CONTENT_URI = RawContacts.CONTENT_URI;
        public static final String SELECTION = COLUMN_CONTACT_ID + "=?) AND (" + ACCOUNT_TYPE + " =?";
    
        public static final String[] PROJECTION =
                new String[] {COLUMN_CONTACT_ID};
    
    }
    

    我看到它很慢,但我找不到其他方法。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2017-02-07
      • 2015-08-27
      • 2012-04-18
      • 1970-01-01
      • 1970-01-01
      • 2013-07-11
      • 2011-06-19
      相关资源
      最近更新 更多