2017-02-20 38 views
3

在聯繫人的頂部ID,Android也得到了LOOK_UP的關鍵。由於id的聯繫人可以更改,您可以獲取用戶uri,使用LOOK_UP鍵。Android聯繫人:查找鍵是如何工作的?

public static Uri lookupContactUri(String lookup, Context context){ 
    ContentResolver contentResolver = context.getContentResolver(); 
    Uri lookupUri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, lookup); 
    return ContactsContract.Contacts.lookupContact(contentResolver, lookupUri); 
} 

但它是如何工作的? Contacts.lookupContact的源代碼沒有詳細介紹實際的實現。那麼任何人都可以解釋他們是如何設法解決這個問題的?

/** 
    * Computes a content URI (see {@link #CONTENT_URI}) given a lookup URI. 
    * <p> 
    * Returns null if the contact cannot be found. 
    */ 
    public static Uri lookupContact(ContentResolver resolver, Uri lookupUri) { 
     if (lookupUri == null) { 
      return null; 
     } 

     Cursor c = resolver.query(lookupUri, new String[]{Contacts._ID}, null, null, null); 
     if (c == null) { 
      return null; 
     } 

     try { 
      if (c.moveToFirst()) { 
       long contactId = c.getLong(0); 
       return ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId); 
      } 
     } finally { 
      c.close(); 
     } 
     return null; 
    } 

我測試的另一件事,使用ContactsContract.AggregationExceptions合併兩個觸點,然後採石爲接觸URI。兩個LOOK_UP鍵都會產生與預期相同的聯繫人URI。

那他們怎麼做呢?

回答

2

由於聯繫人ID可能會不時發生變化(例如,當聯繫人同步已損壞且聯繫人需要重新從服務器重新連接)時,Android引入了LookupKeys和LookupUris的概念。

一個LookupKeyopaque值,在內部可以通過Contacts框架,一組字段的翻譯:contact-idraw-contact-idsprimary-display-names

每當你嘗試通過LookupUri訪問聯繫人時,系統,從Uri中提取LookupKey,嘗試訪問contact-id,並將其他字段(raw-id,名稱等)與找到的聯繫人進行比較,如果它看起來是正確的聯繫人,則返回它。 如果未找到contact-id,或系統檢測到它是錯誤的聯繫人,則會對所有聯繫人進行查詢以找到正確的聯繫人(使用該密鑰上存儲的輔助字段)。

因此,LookupKey是一種快速方法,可以返回contact-id,或者在出現問題時搜索它。