2012-05-10 87 views
0

我一直在嘗試通過名稱獲取聯繫人的電子郵件,但遇到了一些困難。 這裏是我如何我試圖做到這一點:通過名稱獲取聯繫人電子郵件

Cursor emailCur = cr.query(
      ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, 
      ContactsContract.CommonDataKinds.Email.DISPLAY_NAME + " = ?", 
      new String[] { contactName }, null); 
    while (emailCur.moveToNext()) { 
     String email = emailCur 
       .getString(emailCur 
         .getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); 
     String emailType = emailCur 
       .getString(emailCur 
         .getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE)); 
       } 
    emailCur.close(); 

我不斷地得到一個例外,我究竟做錯了什麼?

現在我得到了我的遊標循環的零迭代。

+0

請發表您的logcat的錯誤,所以我們知道哪些異常和原因。 – Sam

回答

2

查詢電子郵件地址與電話號碼相似。必須執行查詢才能從數據庫獲取電子郵件地址。查詢存儲在ContactsContract.CommonDataKinds.Email.CONTENT_URI中的URI以查詢電子郵件地址表。

Cursor emailCur = cr.query( 
    ContactsContract.CommonDataKinds.Email.CONTENT_URI, 
    null, 
    ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", 
    new String[]{id}, null); 
while (emailCur.moveToNext()) { 
    // This would allow you get several email addresses 
     // if the email addresses were stored in an array 
    String email = emailCur.getString(
        emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); 
    String emailType = emailCur.getString(
        emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE)); 
} 
emailCur.close(); 

通過手機查詢郵件表中的字段名稱也下ContactsContract.CommonDataKinds存儲。電子郵件查詢在ContactsContract.CommonDataKinds.Email.CONTENT_URI中的URI上執行,並且WHERE子句必須與ContactsContract.CommonDataKinds.Email.CONTACT_ID字段匹配。由於可以通過Cursor中返回的記錄循環存儲多個電子郵件地址。

更多教程here

+0

我試圖做類似的東西,與顯示名稱而不是id和它失敗,我需要能夠通過顯示名稱獲得電子郵件 –

+1

我有一個類似的問題。似乎電子郵件表總是有一個空的顯示名稱。任何人有類似的問題? – rycfung

0

我想你需要在調用while(...)循環之前調用emailCur.moveToFirst()。

不知道如果你的工作,但我總是構建我的光標循環是這樣的:

while(!emailCur.isAfterLast()) 
{ 
    //Do stuff with cursor 

    emailCur.moveToNext(); 
} 

編輯:另外,如果你說你是查找電子郵件通過其聯繫人的顯示名稱,請你是指聯繫人的姓名(例如John Smith),還是電子郵件地址的顯示名稱?在上面的循環中,你正在做後者。

編輯#2:這裏是如何獲取所有聯繫人的電子郵件地址(以及電話和地址)的教程。您需要稍微修改它,以便第一部分只返回您指定顯示名稱的聯繫人。仍然需要完成關於基於聯繫人_ID返回電子郵件地址的部分。

http://www.higherpass.com/Android/Tutorials/Working-With-Android-Contacts/

的修改,只得到您傳遞將在找顯示名稱相匹配的聯繫人的ID 非常就像你最初發布,用的URI的您查詢例外,您將顯示名稱與之匹配的數據類型(現在它將變爲:ContactsContract.Contacts.DISPLAY_NAME)。

+0

當光標經過最後一行時,moveToNext()返回false。原始循環將按預期工作。你也沒有使用moveToFirst()...'而(emailCur.moveToNext())'是準確的速記。 – Sam

+0

好吧,有道理。 – Gophermofur

+0

我正在談論聯繫人的名字。 –

0

從名稱獲取電子郵件::

public String getEmail(String name, Context context){ 

    String email = null; 
    String selection = ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " like'%" + 
      name + "%'"; 
    final String[] projection = new String[]{Email.DATA, // use 
      // Email.ADDRESS 
      // for API-Level 
      // 11+ 
      Email.TYPE}; 
    Cursor c = context.getContentResolver().query 
      (Email.CONTENT_URI, 
        projection, selection, null, null); 
    if (c != null && c.moveToFirst()) { 
     email = c.getString(0); 
     c.close(); 
    } 
    if (email == null) 
     email = "Unsaved"; 

    Log.d(TAG, "email: " + email); 
    return email; 
} 
+0

看起來像代碼塊中缺少一些項目。 –

相關問題