【问题标题】:Pick contact name and email if exists选择联系人姓名和电子邮件(如果存在)
【发布时间】:2012-09-28 07:18:02
【问题描述】:

用户从他们的联系人中选择一个联系人,这是回调函数(我跳过了onActivityResult(...) 代码,它工作正常):

private User addUserFromContactData(Intent data) {
    Uri contactData = data.getData();

    // Cursor loader to query contact information
    CursorLoader cl = new CursorLoader(this);
    String[] projection = { ContactsContract.Contacts.DISPLAY_NAME,
        ContactsContract.CommonDataKinds.Email.DATA };
    cl.setProjection(projection);
    cl.setUri(ContactsContract.CommonDataKinds.Email.CONTENT_URI);
    cl.setSelection(ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?");
    cl.setSelectionArgs(new String[] { contactData.getLastPathSegment() });

    // Execute query and get results from cursor
    Cursor c = cl.loadInBackground();
    final int nameIndex = c.getColumnIndex(projection[0]);
    final int emailIndex = c.getColumnIndex(projection[1]);

    User user = null;
    if (c.moveToFirst()) {
        user = new User();
        user.setName(c.getString(nameIndex));
        user.setEmail(c.getString(emailIndex));
    }

    c.close();
    return user;
}

此方法适用于具有电子邮件地址的联系人。但是当我选择一个没有它的联系人时,找不到任何结果。电子邮件对我来说是可选的,所以如果没有电子邮件,我只会使用联系人姓名。好像我只选择带有电子邮件地址的联系人。

谁能帮帮我?也许我需要查询两次,第一次获取姓名,第二次获取可选电子邮件?

谢谢大家。

【问题讨论】:

  • 如果您知道您的联系人没有电子邮件,那么您不应该使用基于该电子邮件字段的where 子句。我对联系人 API 的工作并不多,但是您不能使用ContactsContract.Contacts.CONTENT_URI 来查询联系人并检索CONTACT_ID 是由PICK 产生的那个吗?然后,您可以检索该特定联系人的所有信息,包括电子邮件字段。
  • 嗯,我尝试只更改WHERE 子句,但没有修改Uri。相应地改变Uri 是有意义的。我稍后会试试这个。谢谢@Luksprog! :)
  • 尝试在这里使用我的答案:stackoverflow.com/a/18401101/1735499希望这会有所帮助:)

标签: android android-contacts


【解决方案1】:

解决了。为此,需要两个查询(如果我只能用一个查询,请纠正我):

private User addUserFromContactData(Intent data) {
    Uri contactData = data.getData();

    // Cursor loader to query contact name
    CursorLoader clName = new CursorLoader(this);
    clName.setProjection(new String[] { ContactsContract.Contacts.DISPLAY_NAME });
    clName.setUri(ContactsContract.Contacts.CONTENT_URI);
    clName.setSelection(ContactsContract.Contacts._ID + " = ?");
    clName.setSelectionArgs(new String[] { contactData.getLastPathSegment() });

    // Cursor loader to query optional contact email
    CursorLoader clEmail = new CursorLoader(this);
    clEmail.setProjection(new String[] { ContactsContract.CommonDataKinds.Email.DATA });
    clEmail.setUri(ContactsContract.CommonDataKinds.Email.CONTENT_URI);
    clEmail.setSelection(ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?");
    clEmail.setSelectionArgs(new String[] { contactData.getLastPathSegment() });

    // Execute queries and get results from cursors
    Cursor cName = clName.loadInBackground();
    Cursor cEmail = clEmail.loadInBackground();
    final int nameIndex = cName.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
    final int emailIndex = cEmail.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA);

    User user = null;
    if (cName.moveToFirst()) {
        user = new User();
        user.setName(cName.getString(nameIndex));
    }

    // This only could be true if selected contact has at least one email
    if (cEmail.moveToFirst() && user != null) {
        user.setEmail(cEmail.getString(emailIndex));
    }

    cName.close();
    cEmail.close();
    return user;
}

感谢@Luksprog的提示!在之前的代码中,我只使用电子邮件查询联系人,因为CursorLoaderUriContactsContract.CommonDataKinds.Email.CONTENT_URI

【讨论】:

    猜你喜欢
    • 2020-03-01
    • 2016-01-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-09-07
    • 1970-01-01
    相关资源
    最近更新 更多