2010-06-16 114 views
4

我想從地址簿中獲取聯繫人的暱稱。我從他的電話號碼開始,查詢它並希望暱稱(又名別名)作爲結果。日誌的檢索聯繫人的暱稱

Cursor cur = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.NUMBER + " = " + incomingNumber, null, null); 

     if (cur.moveToFirst()) { 
      Log.e("saymyname", cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Nickname.NAME))); 
      Log.e("saymyname", cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Nickname.LABEL))); 
     } 

輸出是incomingNumber(第一Log.e())和空(第二Log.e()),但我想要得到的聯繫人的暱稱!

感謝 湯姆

回答

4

暱稱是在不同的表比電話號碼舉行,您要查詢ContactsContract.Data.CONTENT_URI

檢查這個question

2

answer from Pentium10是非常有幫助我的答案!謝謝!

如果有人需要一個樣品,看看下面的代碼:

public String accessContact(String incomingNumber) { 
     if (incomingNumber == null || "".equals(incomingNumber)) { 
      return "unknown"; 
     } 

     try { 
      Cursor cur = context.getContentResolver().query(Phone.CONTENT_URI, new String[] {Phone.DISPLAY_NAME, Phone.TYPE, Phone.CONTACT_ID}, Phone.NUMBER + " = " + incomingNumber, null, null); 

      int nameIndex = cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME); 
      int typeIndex = cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE); 
      int idIndex = cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID); 

      String name; 
      String type; 
      String id; 

      if (cur.moveToFirst()) { 
       name = cur.getString(nameIndex); 
       type = cur.getString(typeIndex); 
       id = cur.getString(idIndex); 
      } else { 
       return "unknown"; 
      } 

      cur = context.getContentResolver().query(ContactsContract.Data.CONTENT_URI, new String[] {ContactsContract.Data.DATA1}, ContactsContract.Data.CONTACT_ID + " = " + id, null, null); 

      int nicknameIndex = cur.getColumnIndex(ContactsContract.Data.DATA1); 
      String nickname; 

      if (cur.moveToFirst()) { 
       nickname = cur.getString(nicknameIndex); 
       if (nickname.equals(incomingNumber)) { 
        return name; 
       } 
       return nickname; 
      } else { 
       return name; 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
      return "unknown"; 
     } 
2

(我沒有必要的口碑評論,所以我要補充答案)

TomTasche's answer是誤導性的,它得到了我浪費了大量的時間,試圖弄清楚爲什麼我不能在我知道有聯繫的聯繫人上獲得正確的暱稱。

我自己找到了答案,但得到this post的確認,我現在正在正確地做。

基本上當你讀ContactsContract.Data文檔閱讀:

數據表的每一行通常用於聯繫人信息的單件存儲(諸如電話號碼)和其相關聯的元數據(如是否是工作或家庭號碼)。

這解釋了TomTasche代碼的黑幕部分:

if (nickname.equals(incomingNumber)) { 
       return name; 
      } 

既然做了搜索只用CONTACT_ID可以返回多行(每個信息類型),它不能保證第一個包含暱稱。當有暱稱時,它將出現在DATA1中,但phone number也出現在DATA1中。

ContactsContract.Data文檔中的示例部分清楚地表明,必須基於MIME_TYPE選擇行,只有在選擇了MIME_TYPE後,我們才能開始理解行本身的內容。

一個適當的查詢將因此會:

cursor = getContentResolver().query(
       ContactsContract.Data.CONTENT_URI, 
       new String[]{Nickname.NAME}, 
       ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + "= ?", 
       new String[]{contactID, Nickname.CONTENT_ITEM_TYPE}, 
       null); 

(其中暱稱是ContactsContract.CommonDataKinds.Nickname

我覺得我必須說,關於這一主題的東西,以防止其他人浪費了太多的時間,因爲我沒有根據在這個唯一的話題上(第一個我和我的Google朋友一起找到的)。

+0

也許聯繫人數據庫發生了變化,或者當時我錯了(這個答案確實很舊)。無論如何,感謝您發佈更好的解決方案! – TomTasche 2014-05-29 08:42:38

+0

沒問題。無論如何,知識是一個漸進的過程,所以我很高興我能把你的答案帶到現在。感謝您將它發佈在第一個地方:p – 2014-06-06 17:50:58