1

我知道聚合联系人 _ids 不是静态的,但可能会随着时间的推移而变化(请参阅:Google Group Discussion)。

因此,在我的应用程序中,我存储了内容查找键和所选联系人的当前 ID。

我要做的是:当一条消息来自特定的电子邮件地址时,查询电话联系人并查看来自电子邮件地址的联系人是否与其中任何一个相关联,然后将该联系人与我存储的联系人进行比较,首先做使用我存储的联系人 _id 和查找键的新查询来获取当前联系人 _id。

以下是我尝试使用电子邮件地址查找联系人 _id 的方式:

String[] projection = {
    ContactsContract.Contacts.LOOKUP_KEY,
    ContactsContract.Contacts._ID
}

uri = Uri.withAppendedPath(ContactsContract.CommonDataKinds.Email.CONTENT_LOOKUP_URI, Uri.encode(data)); //data = email address
cur = resolver.query(uri, projection, null, null, null);

if (cur != null){
    while (cur.moveToNext()){
        msg.set_contact(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY)), cur.getLong(cur.getColumnIndex(ContactsContract.Contacts._ID)));
    }
}

上面的代码的工作原理是它发现电子邮件地址与电话上的联系人相关联。

问题:我想我得到的是原始电子邮件地址条目的 _id,而不是整个联系人的 _id。因为当我刷新存储的联系人 _id 并将其与从上面返回的内容进行比较时,它们不匹配,即使我已确认该电子邮件与我存储的联系人相关联。

以下是我查找存储的联系人的方式:

String[] projection = {
    ContactsContract.Contacts.LOOKUP_KEY,
    ContactsContract.Contacts._ID
}

Uri uri = ContactsContract.Contacts.getLookupUri(contact_id, contact_lookup);

Cursor cur = resolver.query(cLookupUri, projection, null, null, null);
if(cur != null){
    while (cur.moveToNext()){
        msg.set_contact(cur.getString(cur.getColumnIndex(ContactsContract.Contacts.LOOKUP_KEY)), cur.getLong(cur.getColumnIndex(ContactsContract.Contacts._ID)));
    }
}

我究竟做错了什么?基本上我只想获取与传入电子邮件地址关联的任何联系人的contact_id ...

任何帮助深表感谢!

4

2 回答 2

4
    public Long getContactIdByEmail(String email) {
        Uri uri = Uri.withAppendedPath(ContactsContract.CommonDataKinds.Email.CONTENT_FILTER_URI, Uri.encode(email));
        String name = "?";
        long contactId =0;

        ContentResolver contentResolver = v.getContext().getContentResolver();
        Cursor contactLookup = contentResolver.query(uri, new String[] {ContactsContract.Data.CONTACT_ID, ContactsContract.Data.DISPLAY_NAME }, null, null, null);

        try {
            if (contactLookup != null && contactLookup.getCount() > 0) {

                contactLookup.moveToNext();
                name = contactLookup.getString(contactLookup.getColumnIndex( ContactsContract.Data.DISPLAY_NAME ));
                contactId = contactLookup.getLong(contactLookup.getColumnIndex(ContactsContract.Data.CONTACT_ID));

            }
        } finally {
            if (contactLookup != null) {
                contactLookup.close();
            }
        }

        return contactId;
    }
于 2015-01-17T17:00:06.950 回答
0

尝试这个:

查询 ContactsContract.Contacts.Entity。选择 MIMETYPE = "vnd.android.cursor.dir/email_v2" 和 DATA1 = 传入电子邮件地址。

这将返回一个表,其中包含每个原始联系人的一行,其电子邮件地址与传入地址匹配,但该行还将包含原始联系人的聚合联系人 ID。由此,您可以查询 ContactsContract.Contacts 以找到 LOOKUP_KEY。

于 2012-11-02T20:32:59.570 回答