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();

我经常遇到异常,我做错了什么?

现在我的光标循环的迭代为零。

4

3 回答 3

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 字段匹配。由于可以通过光标中返回的记录循环存储多个电子邮件地址。

更多教程在这里

于 2012-05-10T18:02:23.627 回答
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

于 2012-05-10T16:28:29.070 回答
0

从 name:: 获取电子邮件

 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;
}
于 2017-12-29T10:49:28.553 回答