使用Android联系人API时出现问题

使用Android联系人API时出现问题,android,android-intent,android-contacts,Android,Android Intent,Android Contacts,使用Android联系人API时出现问题 编辑文本旁边有一个按钮。当用户单击按钮时,将使用以下代码调用Contact API: Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); startActivityForResult(intent, Constants.PICK_CONTACT); 上述代码将调用以下方法: @Override public void onA

使用Android联系人API时出现问题

编辑文本旁边有一个按钮。当用户单击按钮时,将使用以下代码调用Contact API:

Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(intent, Constants.PICK_CONTACT);
上述代码将调用以下方法:

@Override
    public void onActivityResult(int reqCode, int resultCode, Intent data) {
        super.onActivityResult(reqCode, resultCode, data);
            if (reqCode == Constants.PICK_CONTACT) {
                if (resultCode == Activity.RESULT_OK) {
                    String contactStr = getContactInfo(data);
                    mEditTxtTo.setText(contactStr);
                }
             }
}


protected String getContactInfo(Intent intent) {
        String contactEmail = "";
        Cursor cursor = managedQuery(intent.getData(), null, null, null, null);

        while (cursor.moveToNext()) {
            String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
            // Find Email Addresses
            Cursor emails = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null,
                    ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = " + contactId, null, null);

            while (emails.moveToNext()) {
                if (contactEmail.trim().length() > 0) {
                    contactEmail = new StringBuilder(contactEmail).append(IShipdocsMobileConstants.SEMICOLON_DELIMITER)
                            .append(emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA))).toString();
                } else {
                    contactEmail = emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
                }
            emails.close();
        }
        cursor.close();
        return contactEmail;
    }
我添加了if-else条件来处理以下问题:

假设在名为A的联系人中,有3个电子邮件Id。因此,在第一封电子邮件添加到contactEmail之后,下一封电子邮件将附加在第一封电子邮件之后,以分号分隔&循环将持续到最后一个元素

if (contactEmail.trim().length() > 0) {
                        contactEmail = new StringBuilder(contactEmail).append(";")
                                .append(emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA))).toString();
                    } else {
                        contactEmail = emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));

                }
当一个联系人有多封电子邮件时,当前面临的问题

假设有3个联系人,A、B和C

现在,联系人姓名:A有以下电子邮件:

a@a.com b@b.com c@c.com

联系人姓名:B有以下电子邮件:

b@b.com c@c.com

如果只添加了联系人A, b@b.com在contactEmail上添加了两次。 在我看来,上面的代码似乎在搜索b@b.com在所有联系人上

因此,返回的最后一封电子邮件是:a@a.com , b@b.com , c@c.com , b@b.com


查找上述代码错误的任何建议/提示。

检查外部循环的次数:

while (cursor.moveToNext()) {
正在为联系人A执行。对于该循环的每次迭代,按如下方式打印contactId和contactEmail:

Log.d("debug for stack overflow", contactEmail + " : " + contactId);
这将有助于确定发生了什么


如果您在此之后还需要更多帮助,请发布我刚才建议的结果。

我认为第一步是确定您是否在游标查询中收到了所有4封电子邮件。它将帮助您确定字符串构建循环或游标查询是否存在问题。您可以使用
DatabaseUtils.dumpCursor(Cursor Cursor)
吐出查询电子邮件地址返回的整个游标。