【问题标题】:ContactsContract.CommonDataKinds.Email.* returns phone numberContactsContract.CommonDataKinds.Email.* 返回电话号码
【发布时间】:2015-04-22 06:05:13
【问题描述】:

我正在尝试从ContactsContract.CommonDataKinds.Email.ADDRESSContactsContract.CommonDataKinds.Email.DATAContactsContract.CommonDataKinds.Email.DATA1 获取电子邮件,所有这些都没有返回我的联系人的电子邮件,其中包含一封电子邮件。我通常会得到上述联系人的电话号码。

到目前为止,我尝试过的一切都失败了..

有什么想法吗?

编辑:到目前为止我已经尝试过什么......

Uri contactData = data.getData();


                    String[] projection =
                            {
                                    ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
                                    ContactsContract.CommonDataKinds.Phone.NUMBER,
                                    ContactsContract.CommonDataKinds.Email.ADDRESS 

                            };

                    Cursor cursor = getContentResolver().query(contactData,projection,null,null,null);
                    if(cursor.moveToFirst()){
                        String phoneName = cursor.getString(2);

                        Log.d("EMAIL:",phoneName);
                    }

对于ContactsContract.CommonDataKinds.Email.ADDRESS,我尝试将ADDRESS 替换为.DATA1、DATA、_ID、CONTACT_ID 等。但是,这些都不会返回电子邮件地址,但有些会返回联系人的电话号码,仅此而已。

【问题讨论】:

  • 当然,我会编辑我的原始帖子并添加代码。
  • 感谢@spaceghost。如果您的问题符合标准,我会投票
  • 能否调试代码并检查光标中的值是多少?
  • 所以您希望同时返回电话号码和电子邮件地址?
  • 我在这里合法地问...这有关系吗?我确实希望两者都返回,但如果我只想要电话号码或电子邮件,我的代码是否必须完全不同?

标签: java android android-intent contactscontract


【解决方案1】:

不确定您的代码有什么问题,您是否可以执行以下代码以获取特定联系人的电子邮件地址。

示例代码:

 public String retrieveMailId(Context ctx, Uri contactUri) {
            String email = null, contactId = null;

            Cursor cursorID = ctx.getContentResolver().query(contactUri,
                    new String[] { ContactsContract.Contacts._ID }, null, null,
                    null);

            if (cursorID == null) {
                return null;
            }

            if (cursorID.moveToFirst()) {

                contactId = cursorID.getString(cursorID
                        .getColumnIndex(ContactsContract.Contacts._ID));
            }

            cursorID.close();

            if (TextUtils.isEmpty(contactId)) {
                return null;
            }

            // Using the contact ID now we will get email address.
            Cursor cursor = ctx.getContentResolver().query(
                    ContactsContract.CommonDataKinds.Email.CONTENT_URI,
                    null,
                    ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = "
                            + contactId, null, null);

            if (cursor.moveToFirst()) {
                int colIdx = cursor
                        .getColumnIndex(ContactsContract.CommonDataKinds.Email.ADDRESS);
                email = cursor.getString(colIdx);
            }
            cursor.close();

            return email;

        }

【讨论】:

  • 谢谢robinhood,我已经完美地应用了你的方法,但是,电子邮件返回一个空值。请注意,我选择的联系人有电子邮件。
  • 如果您的联系人不包含电子邮件地址,那么它将返回 null 否则您将获得电子邮件地址。
  • 我知道。我的联系人包含 3 件事。 1)电话号码 2)前面的电话号码(带+)。 3)电子邮件地址“abc@yahoo.com”
  • 嗯.. 我通过电子邮件选择了不同的联系人。我得到的结果是 support@unroll.me 知道这是什么吗?
  • 在联系人应用程序中手动检查与该联系人关联的电子邮件地址,是相同还是不同?
【解决方案2】:

很快,您需要另一个用于电子邮件的光标:

Cursor emails = contentResolver.query(Email.CONTENT_URI,null,Email.CONTACT_ID + " = " + contactId, null, null);
        while (emails.moveToNext()) 
        { 
           String email = emails.getString(emails.getColumnIndex(Email.DATA));
            break;
        }
        emails.close();

希望对某人有所帮助...

【讨论】:

    【解决方案3】:

    在检索联系人 ID 时,我想指出一个小缺陷:不要使用 ContactsContract.Contacts._ID,而是在查询中的字符串数组中使用 ContactsContract.CommonDataKinds.Email.CONTACT_ID。提取 ID 后,使用以下代码行:

    String id = cursor.getString(
        cursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.CONTACT_ID)
    );
    

    【讨论】:

      猜你喜欢
      • 2023-02-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-04-15
      • 2019-12-27
      • 2014-06-05
      • 2017-01-14
      • 1970-01-01
      相关资源
      最近更新 更多