无法从 android 中选择的联系人获取电子邮件地址

Not able to get email address from picked contact in android

我正在尝试使用 android 中的意图选择联系人。我需要的信息是姓名、phone 号码和联系人的电子邮件地址。按照我到目前为止的尝试。

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);

    if (resultCode == Activity.RESULT_OK) {
        // Check for the request code, we might be usign multiple startActivityForReslut
        switch (requestCode) {
            case RESULT_PICK_CONTACT:
                contactPicked(data);
                break;
        }
    }
}

private void contactPicked(Intent data) {
    Cursor cursor = null;
    try {
            // getData() method will have the Content Uri of the selected contact
        Uri uri = data.getData();
        //Query the content uri
        cursor = getActivity().getContentResolver().query(uri, null, null, null, null);
        cursor.moveToFirst();

        int phoneIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER);
        int nameIndex = cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);

        String phoneNo = cursor.getString(phoneIndex);
        String name = cursor.getString(nameIndex);
        String contactBookId = uri.getLastPathSegment();

        String email = null;
        try {
            Cursor emailCur
                    = getActivity().getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,
                                                                null,
                                                                ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?",
                                                                new String[]{contactBookId}, null);
            emailCur.moveToFirst();
            while (emailCur.moveToNext()) {
                String phone = emailCur.getString(emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
                int type = emailCur.getInt(emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE));
                String s = (String) ContactsContract.CommonDataKinds.Email.getTypeLabel(getActivity().getResources(), type, "");

                Log.d("TAG", s + " email: " + phone);
            }
            emailCur.close();
        } catch (Exception e) {
            Log.e(TAG, "Exception while trying to fetch email addresses of " + name + ":" + e.getMessage());
        }
        cursor.close();
    } catch (Exception e) {
        e.printStackTrace();
    }
}

这是我发射意图的方式

Intent contactPickerIntent = new Intent(Intent.ACTION_PICK,
            ContactsContract.CommonDataKinds.Phone.CONTENT_URI);
    startActivityForResult(contactPickerIntent, RESULT_PICK_CONTACT);

我的问题是 emailCur 从不读取任何电子邮件地址。代码永远不会进入循环。

编辑

即使我放弃 getLastPathSegment() 并按如下方式检索 ID,我也会得到相同的行为

            int idIndex = cursor.getColumnIndex(ContactsContract.Data.CONTACT_ID);
        String contactBookId = cursor.getString(idIndex);

问题出在这里:

emailCur.moveToFirst();
while (emailCur.moveToNext()) {
...
}

您在阅读前将光标移动了两次,如果联系人有 1 封电子邮件,则永远不会进入 while 循环。

删除emailCur.moveToFirst();