2012-11-02 132 views
1

我知道,与聚集接触_ids不是静态的,但可能会随时间而改变,以取得联系_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 ...

任何帮助,非常感谢!

+0

你是如何解决的呢?我不明白。 – 2014-12-11 18:05:43

回答

0

试试这个:

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

这将返回一个包含所有的原料接触,其E-mail地址输入的地址匹配一个行的表,但该行也将包含原始联系人的总联系人ID。从这里,您可以查询ContactsContract.Contacts以查找LOOKUP_KEY。

+0

谢谢你的回复。它使我找到了解决这个问题的正确道路。这是我做的:我使用的Uri没有错误,我只是在我的投影中抓住了错误的列。查看ContactsContract.CommonDataKinds.Email API ref显示它根据您提到的MIMETYPE(vnd.android.cursor.item/email_v2)进行过滤,并返回原始联系人数据以及聚合联系人数据。我只需要抓取contact_id字段而不是_id字段。感谢您的帮助 – SjB

+2

只是一个快速的音符,但我想你或许应该使用预定义的常量ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE而不是直接硬编码的MIME类型。 – Jules

3
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; 
    } 
相关问题