2017-02-20 10 views
3

連絡先の上にid、また、LOOK_UPキーを手に入れました。 連絡先のIDが変更できるので、LOOK_UPキーを使用して、ユーザーURIを取得できます。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を使用して2人の連絡先をマージして、連絡先URIのために採石されます。 LOOK_UPの両方のキーが、期待どおり同じ連絡先URIで生成されます。

どのように彼らはそれをやっていますか?

答えて

2

連絡先IDは時々変更される可能性があります(連絡先の同期が壊れ、連絡先をサーバーから再同期する必要があるなど)。AndroidではLookupKeysとLookupUrisという概念が導入されました。

LookupKeyが内部フィールドのセットにContactsフレームワークによって翻訳することができ、opaque値である:あなたがLookupUri経由で連絡先にアクセスしようとするたびに、など、

contact-idraw-contact-idsprimary-display-namesシステムでは、UriからLookupKeyを抽出し、contact-idにアクセスしようとし、見つかった連絡先と他のフィールド(生ID、名前など)を比較します。 contact-idが見つからなかった場合、または連絡先が間違っているとシステムが検出した場合は、すべての連絡先に対してクエリが実行され、正しいキーが検索されます(そのキーに格納されている補助フィールドを使用)。

したがってLookupKeyは、contact-idを返すか、何らかの問題が発生した場合に検索するためのクイックメソッドとして機能します。

関連する問題