2012-11-04 46 views
1

我正在嘗試從電話簿中獲取電話號碼或電子郵件ID來查找聯繫人縮略圖。我編寫的代碼可行,但需要很長時間才能查詢整個聯繫人(效率不高)。查詢聯繫人聯繫電話的縮略圖

下面是代碼

Cursor cursor; 
String[] queryColumns = { ContactsContract.Contacts.PHOTO_THUMBNAIL_URI,ContactsContract.Contacts._ID }; 
ContentResolver cr = getContentResolver(); 
cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, queryColumns, 
          null, null, null); 

cursor.moveToFirst(); 
while (cursor.moveToNext() && continueSearch) { 
    String[] phonesAndEmails = extractPhonesAndEmails(Integer.parseInt(cursor.getString(1))); 
    for(int g=0;g<phonesAndEmails.length;g++){ 
     if(phonesAndEmails[g].equals(searchFor)){ 
      contactThumbUri = cursor.getString(0); 
      MyUtils.addLog("Found Match **************" + contactThumbUri); 
      continueSearch=false; 
     } 
    } 
} 
cursor.close(); 

extractPhonesAndEmails得到一個String [所有的號碼和電子郵件的使用ContactID的]傳遞給它。

我得到了另一種方法,從SO使用PhoneLookup,但該送禮器=我是一個錯誤。我檢查看看這個遊標返回的列是什麼。我只有兩列中的一個作爲聯繫人姓名,另一個是可能是ID的整數。這是第二個代碼;

if(!MyUtils.checkIfEmailID(searchFor)){ 
    Cursor mCursor; 
    Uri qUri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(searchFor)); 
    String[] mqueryColumns = {PhoneLookup.PHOTO_URI}; 
    mCursor = getContentResolver().query(qUri, mqueryColumns,null, null, null); 
    MyUtils.addLog(mCursor.getCount() + " count"); 
    MyUtils.addLog(mCursor.getString(0)); 
    mCursor.moveToFirst(); 
    while (mCursor.moveToNext() && continueSearch) { 
     contactThumbUri=mCursor.getString(0); 
     MyUtils.addLog(contactThumbUri); 
     continueSearch=false; 
    } 
    mCursor.close();  
        } 

請幫助優化我的第一個代碼或在第二個代碼中排除錯誤。謝謝很多。

回答

4

在Joe的回答和this post, 的幫助下,我能夠想出完美工作的代碼。此代碼基本上將電話號碼作爲輸入,並將縮略圖uri返回給聯繫人(如果存在於手機中)。這是代碼。

謝謝喬。

Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(searchFor)); 
String[] projection = {PhoneLookup.LOOKUP_KEY}; 
Cursor cursor = getContentResolver().query(uri, projection, null, null, null); 
cursor.moveToFirst(); 
do{ 
    String lookUpKey = cursor.getString(0); 

    uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_LOOKUP_URI, Uri.encode(lookUpKey)); 
    String[] projection1 = {ContactsContract.Contacts.PHOTO_THUMBNAIL_URI}; 
    Cursor cursor1 = getContentResolver().query(uri, projection1, null, null, null); 
    cursor1.moveToFirst(); 
    contactThumbUri = cursor1.getString(0); 
    cursor1.close(); 
    if(!contactThumbUri.equals(null)){ 
     continueSearch=false; 
    } 
}while(cursor.moveToNext() && continueSearch); 
cursor.close(); 

類似的方法可用於查找電子郵件。需要使用ContactsContract.Contacts.CONTENT_LOOKUP_URI,而不是PhoneLookup.CONTENT_FILTER_URI

希望這可以幫助其他新手像我這樣的:P

1

在ADDRESS上首先查詢ContactsContract.CommonDataKinds.Email並返回包含ContactsContract.ContactsColumns.LOOKUP_KEY的投影。這將爲您提供具有該電子郵件地址的所有聯繫人的彙總聯繫人ID(不變)。從那裏,查詢 ContactsContract.Contacts on LOOKUP_KEY來獲取照片。或者,獲取包含LOOKUP_KEY的行的_ID值,然後在ContactsContract.RawContacts.CONTACT_ID中查詢該行以獲取所有原始聯繫人,然後查詢其照片。

聯繫人數據庫是分層的,你必須感覺到它的層次結構纔能有效地使用它。

此外,你應該總是在後臺線程上進行查詢。

0

試試這個。

final String[] queryColumns = { ContactsContract.Contacts.PHOTO_THUMBNAIL_URI, 
      ContactsContract.Contacts._ID }; 

    final String email = "[email protected]"; 

    final StringBuffer sb = new StringBuffer(); 

    sb.append("mimetype_id = (select _id from mimetypes where mimetype = " + 
      "'vnd.android.cursor.item/email_v2') and data1 = '"+email +"'"); 

    final Cursor cursor = getContentResolver().query(ContactsContract.Data.CONTENT_URI, 
      queryColumns, sb.toString(), null, null); 


    if (cursor == null || !cursor.moveToFirst()) { 
     return; 
    } 

    try { 
     do { 
      final String photoURI = cursor.getString(0); 
      final long contactID = cursor.getLong(1); 

      Log.i("Test", "PhotoURI"+photoURI+"ContactID"+contactID); 

     } while (cursor.moveToNext()); 
    } finally { 
     if (cursor != null) { 
      cursor.close(); 
     } 
    } 
+0

對不起米塔爾薩博,我不會能夠嘗試你的解決方案。感謝您的幫助。 – nightcrawler23