如何从android中的联系人读取电子邮件字段?

Posted

技术标签:

【中文标题】如何从android中的联系人读取电子邮件字段?【英文标题】:How to read email field from contact in android? 【发布时间】:2019-05-24 23:16:33 【问题描述】:

在我的应用程序中,我将手机中的所有联系人读取到列表视图中。 单击列表中的特定视图后, 我想阅读姓名、电话和电子邮件地址。 我设法毫无问题地阅读了姓名和电话。但是收不到邮件。

假设我有 2 个联系人:

Bill
55-555-555
bil@example.com

Mark
66-666-666
mark@example.com

因此电子邮件的字段称为反向。 对于比尔,我收到了马克的电子邮件 对于马克,我收到了比尔的电子邮件。 其他数值都是正确的。

private  HashMap<String,String> getContactNames() 

        HashMap<String,String>contact=new HashMap<>();
        ContentResolver cr = getContentResolver();
        Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
        cursor.moveToPosition(pos_listView);
        String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

        Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
        phones.moveToPosition(pos_listView);
        String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

        Cursor emailcur = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, null,null, null);
        emailcur.moveToPosition(pos_listView);
        String email = emailcur.getString(emailcur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA1));

        contact.put("name",name);
        contact.put("phoneNumber",phoneNumber);
        contact.put("email",email);

        cursor.close();
        return contact;
    

【问题讨论】:

【参考方案1】:

不,这绝对不是它的工作方式。

ContactsContract API 中有 3 个不同的表:

    联系人 原始联系人 数据(您可以通过Data.CONTENT_URI 直接访问,也可以通过Phone.CONTENT_URIEmail.CONTENT_URI 等通过辅助子表访问)

联系人在联系人列表中的位置与该联系人的位置无关,如果其电话或电子邮件在其表格中,因此moveToPosition(pos_listView)是非常错误的。

这是你应该做的:

    在阅读所有联系人列表时,通过Contacts._ID 跟踪他们的联系人ID,并确保在点击联系人时可以获得它 点击联系人时,获取其联系人 ID,并将其发送到您的方法。 在您的联系信息方法中,对所有电话和电子邮件仅查询一次(如果需要,可能还需要更多信息)以一次获取所有信息。

您的方法将如下所示:

private void getContactInfo(long contactId) 
    String[] projection = Data.DISPLAY_NAME, Data.MIMETYPE, Data.DATA1;
    String selection = Data.CONTACT_ID + "=" + contactId + " AND " + Data.MIMETYPE + " IN ('" + Phone.CONTENT_ITEM_TYPE + "', '" + Email.CONTENT_ITEM_TYPE + "')";
    Cursor cur = cr.query(Data.CONTENT_URI, projection, selection, null, null);

    Log.i(TAG, "dumping info for contact id: " + contactId);
    while (cur.moveToNext()) 
        String name = cur.getString(0);
        String mime = cur.getString(1); // type of data: email, phone, company, etc.
        String data = cur.getString(2); // the actual info, e.g. +1-212-555-1234

        String type = Phone.CONTENT_ITEM_TYPE.equals(mime) ? "phone" : "email";

        Log.i(TAG, "info: " + name + " - " + type + ": " + data);
    
    cur.close();

【讨论】:

以上是关于如何从android中的联系人读取电子邮件字段?的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 中从电话簿中读取联系人

如何从android中的单个查询中获取联系人的名字,姓氏,电子邮件ID

如何从 Android 中的 Intent 中获取联系信息?

读取所有联系人数据

如何在 Android 中获取联系人的所有详细信息

在 Android Jellybean 中,如何与我选择的特定字段共享联系人条目?