2012-05-10 55 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

看起来像代码块中缺少一些项目。 –

相关问题