2012-11-02 129 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; 
    } 
相關問題