Filter contacts except groups of account type

廉价感情. 提交于 2019-12-11 14:04:13

问题


I need to build a contact picker which list all phone's contact except an account type of contact. I did follow this way : Example the account type I want to remove from the list is : group = "com.account.myaccount"

First I query all the group id have the account type :

    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 + "=?";
}

And then I query all the contacts except the groups :

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

}

And combinate all :

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

The problem is there are some strange account name is displayed. Some email instead of account name. See on my image :

Please help me resolve the problem. Or do you have any other way to filter the accounts. I am looking for the solution that I can use a CursorAdapter. I can't use a CursorAdapter with my approach.


回答1:


I resolved by myself. I did flow this way :

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

}

I see it quite slow, but I couldn't find out other approach.



来源:https://stackoverflow.com/questions/16810795/filter-contacts-except-groups-of-account-type

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!