【问题标题】:Attempting to get contact _ID using email address尝试使用电子邮件地址获取联系人 _ID
【发布时间】:2012-11-02 20:13:49
【问题描述】:

我知道聚合联系人 _id 不是静态的,但可能会随着时间而改变(请参阅: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...

非常感谢任何帮助!

【问题讨论】:

  • 你是怎么解决这个问题的?我不明白。

标签: android contacts android-contacts


【解决方案1】:
    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;
    }

【讨论】:

    【解决方案2】:

    试试这个:

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

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

    【讨论】:

    • 感谢您的回复。它让我走上了解决这个问题的正确道路。这是我所做的:我使用的 Uri 并不正确,我只是在投影中抓取了错误的列。查看 ContactsContract.CommonDataKinds.Email API 参考表明它根据您提到的 MIMETYPE (vnd.android.cursor.item/email_v2) 进行过滤并返回原始联系人数据以及聚合联系人数据。我只需要获取contact_id 字段而不是_id 字段。感谢您的帮助
    • 只是一个简短的说明,但我认为您可能应该使用预定义的常量 ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE 而不是直接硬编码 mime 类型。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多