如何仅返回Android People应用程序中的主要联系人

如何仅返回Android People应用程序中的主要联系人,android,contacts,Android,Contacts,我正在尝试提取联系人列表并附加与给定人员关联的所有联系人。我遇到的问题是,我的查询返回了所有发送过电子邮件的联系人。我不想包括我发过电子邮件的每个联系人,但是,我只想包括主要联系人(如内置的People应用程序中显示的联系人) 在下面的代码中,我试图通过使用Contacts contract.Contacts.CONTENT\u URI查询来限制返回的电子邮件,但这似乎不起作用 任何帮助都将不胜感激 private ArrayList<ContactFriend> allContac

我正在尝试提取联系人列表并附加与给定人员关联的所有联系人。我遇到的问题是,我的查询返回了所有发送过电子邮件的联系人。我不想包括我发过电子邮件的每个联系人,但是,我只想包括主要联系人(如内置的People应用程序中显示的联系人)

在下面的代码中,我试图通过使用Contacts contract.Contacts.CONTENT\u URI查询来限制返回的电子邮件,但这似乎不起作用

任何帮助都将不胜感激

private ArrayList<ContactFriend> allContacts;
private Cursor contactsCursor;
private Cursor emailCursor;

void load() {
    getLoaderManager().initLoader(CONTACTS_LOADER_ID, null, this);
    getLoaderManager().initLoader(EMAILS_LOADER_ID, null, this);
}

@Override
public Loader<Cursor> onCreateLoader(int id, Bundle args) {
    if (id == CONTACTS_LOADER_ID) {
        String[] projection = {
                ContactsContract.Contacts._ID,
                ContactsContract.Contacts.DISPLAY_NAME_PRIMARY,
                ContactsContract.Contacts.PHOTO_THUMBNAIL_URI,
        };
        String sortOrder = ContactsContract.Contacts.DISPLAY_NAME_PRIMARY + " ASC";
        return new CursorLoader(getActivity(),
                ContactsContract.Contacts.CONTENT_URI,
                projection,
                null,
                null,
                    sortOrder);
    } else if (id == EMAILS_LOADER_ID) {
        String[] projection = {
                ContactsContract.CommonDataKinds.Email.DATA,
                ContactsContract.CommonDataKinds.Email.CONTACT_ID
        };
        String sortOrder =
                ContactsContract.CommonDataKinds.Email.CONTACT_ID + ", " +
                        ContactsContract.CommonDataKinds.Email.DATA + " ASC";
        return new CursorLoader(getActivity(),
                            ContactsContract.CommonDataKinds.Email.CONTENT_URI,
                            projection,
                            null,
                            null,
                            sortOrder);
    } else {
        // should never happen
        return null;
    }
}

@Override
public void onLoadFinished(Loader<Cursor> loader, Cursor cursor) {
    int id = loader.getId();
    if (id == CONTACTS_LOADER_ID) {
        contactsCursor = cursor;
    } else if (id == EMAILS_LOADER_ID) {
        emailCursor = cursor;
    }

    if (contactsCursor != null && emailCursor != null) {
        init();
    }
}

void init() {
    if (allContacts == null) {
        allContacts = getAllContacts();
    }
    // do stuff with allContacts
}

private ArrayList<ContactFriend> getAllContacts() {
    HashMap<Integer, ArrayList<String>> emails = getEmailMap();
    ArrayList<ContactFriend> result = new ArrayList<ContactFriend>();

    contactsCursor.moveToFirst();
    do {
        String name = contactsCursor.getString(contactsCursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME_PRIMARY));
        String photo = contactsCursor.getString(contactsCursor.getColumnIndex(ContactsContract.Contacts.PHOTO_THUMBNAIL_URI));
        int id = contactsCursor.getInt(contactsCursor.getColumnIndex(ContactsContract.Contacts._ID));
        ArrayList<String> contactEmails = emails.get(id);
        if (!contactEmails.isEmpty()) {
            result.add(new ContactFriend(name, contactEmails, photo, id));
        }
    } while (contactsCursor.moveToNext());
    return result;
}

private HashMap<Integer, ArrayList<String>> getEmailMap() {
    HashMap<Integer, ArrayList<String>> result = new HashMap<Integer, ArrayList<String>>();

    while (contactsCursor.moveToNext()) {
        int id = contactsCursor.getInt(contactsCursor.getColumnIndex(ContactsContract.Contacts._ID));
        result.put(id, new ArrayList<String>());
    }

    Set<Integer> contactIds = result.keySet();
    while (emailCursor.moveToNext()) {
        int id = emailCursor.getInt(emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.CONTACT_ID));
        if (contactIds.contains(id)) {
            String email = emailCursor.getString(emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
            result.get(id).add(email);
        }
    }
    return result;
}
private ArrayList allContacts;
专用游标接触器;
私有游标;
空荷载(){
getLoaderManager().initLoader(联系人\u LOADER\u ID,null,this);
getLoaderManager().initLoader(电子邮件\u LOADER\u ID,null,this);
}
@凌驾
公共加载器onCreateLoader(int-id,Bundle-args){
如果(id==联系人\u加载器\u id){
字符串[]投影={
联系人合同联系人。\u ID,
Contacts contract.Contacts.DISPLAY\u NAME\u PRIMARY,
Contacts contract.Contacts.PHOTO\u缩略图\u URI,
};
字符串排序器=Contacts contract.Contacts.DISPLAY\u NAME\u PRIMARY+“ASC”;
返回新的游标装入器(getActivity(),
Contacts contract.Contacts.CONTENT\u URI,
投影,
无效的
无效的
分拣机);
}else if(id==电子邮件\u加载器\u id){
字符串[]投影={
Contacts contract.CommonDataTypes.Email.DATA,
ContactsContract.CommonDataTypes.Email.CONTACT\u ID
};
字符串排序器=
ContactsContract.CommonDataTypes.Email.CONTACT_ID+“,”+
ContactsContract.CommonDataTypes.Email.DATA+“ASC”;
返回新的游标装入器(getActivity(),
ContactsContract.CommonDataTypes.Email.CONTENT\u URI,
投影,
无效的
无效的
分拣机);
}否则{
//不应该发生
返回null;
}
}
@凌驾
public void onLoadFinished(加载器,光标){
int id=loader.getId();
如果(id==联系人\u加载器\u id){
contactsCursor=光标;
}else if(id==电子邮件\u加载器\u id){
emailCursor=游标;
}
如果(contactsCursor!=null&&emailCursor!=null){
init();
}
}
void init(){
if(allContacts==null){
allContacts=getAllContacts();
}
//和所有联系人一起做事
}
私有ArrayList getAllContacts(){
HashMap电子邮件=getEmailMap();
ArrayList结果=新建ArrayList();
ContactsCorsor.moveToFirst();
做{
String name=contactsCursor.getString(contactsCursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_name_PRIMARY));
String photo=contactsCursor.getString(contactsCursor.getColumnIndex(ContactsContract.Contacts.photo_缩略图_URI));
int id=contactsCursor.getInt(contactsCursor.getColumnIndex(ContactsContract.Contacts.\u id));
ArrayList contactEmails=emails.get(id);
如果(!contactEmails.isEmpty()){
结果。添加(新联系人朋友(姓名、联系人电子邮件、照片、id));
}
}while(contactsCursor.moveToNext());
返回结果;
}
私有HashMap getEmailMap(){
HashMap结果=新建HashMap();
while(contactsCursor.moveToNext()){
int id=contactsCursor.getInt(contactsCursor.getColumnIndex(ContactsContract.Contacts.\u id));
put(id,newarraylist());
}
设置contactIds=result.keySet();
while(emailCursor.moveToNext()){
int id=emailCursor.getInt(emailCursor.getColumnIndex(ContactsContract.CommonDataTypes.Email.CONTACT_id));
if(ContactID.contains(id)){
String email=emailCursor.getString(emailCursor.getColumnIndex(ContactsContract.CommonDataTypes.email.DATA));
结果。获取(id)。添加(电子邮件);
}
}
返回结果;
}

在其他人有相同问题时添加此选项。将Contacts contract.Contacts.IN_VISIBLE_组添加到投影中,然后仅选择该值等于1的条目,这就是我要查找的内容。

如果其他人有相同问题,请添加此项。将Contacts contract.Contacts.IN_VISIBLE_组添加到投影中,然后仅选择该值等于1的条目,这就是我要查找的内容。

Hi Matt,我也有同样的问题,但我只使用字符串投影,而不是选择,那么,您只选择值等于1的条目是什么意思?@Noni如果您想将返回的行/联系人限制为只包括可见的行/联系人,那么您不仅需要在投影中包括contacts contacts.IN_visible_组,还需要为该列进行选择,如
String selection=Contacts contract.Contacts.IN_VISIBLE_GROUP+“==1”
在我上面的代码中,该选择变量随后成为游标加载程序中的第四个参数。嗨,Matt,我也有同样的问题,但我只使用字符串投影,而不是选择,那么,您只选择值等于1的条目是什么意思?@Noni如果您想将返回的行/联系人限制为只包括可见的行/联系人,那么您不仅需要在投影中包括contacts contacts.IN_visible_组,还需要为该列进行选择,如
String selection=Contacts contract.Contacts.IN_VISIBLE_GROUP+“==1”
在上面的代码中,该选择变量随后成为游标加载程序中的第四个参数。