如何获取联系人的电子邮件地址?

5

我有一个包含手机中所有联系人姓名的列表视图。 我想在点击列表视图中的联系人时获取该联系人的电子邮件地址(如果该联系人拥有)。 我该如何做到这一点?

6个回答

25

使用以下代码获取所有电子邮件ID。我检查了这段代码,它是可行的。

public static void getContactEmails(Context context) {
        String emailIdOfContact = null;
        int emailType = Email.TYPE_WORK;
        String contactName = null;


            ContentResolver cr = context.getContentResolver();
            Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI, null,
                    null, null, null);
            if (cur.getCount() > 0) {
                while (cur.moveToNext()) {
                    String id = cur.getString(cur
                            .getColumnIndex(BaseColumns._ID));
                    contactName = cur
                            .getString(cur
                                    .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                    // Log.i(TAG,"....contact name....." +
                    // contactName);

                    cr.query(
                            ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                            null,
                            ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                                    + " = ?", new String[] { id }, null);

                    Cursor emails = cr.query(Email.CONTENT_URI, null,
                            Email.CONTACT_ID + " = " + id, null, null);
                    while (emails.moveToNext()) {
                        emailIdOfContact = emails.getString(emails
                                .getColumnIndex(Email.DATA));
                        // Log.i(TAG,"...COntact Name ...."
                        // + contactName + "...contact Number..."
                        // + emailIdOfContact);
                        emailType = emails.getInt(emails
                                .getColumnIndex(Phone.TYPE));


                    }
                    emails.close();

                }
            }// end of contact name cursor
            cur.close();


    }

谢谢Deepak,但是这段代码对我没有帮助。我想要获取我点击的联系人的电子邮件地址。(我有一个联系人姓名列表) - Monali
在这里,您将获得所有电子邮件ID和联系人。创建一个Bean,其中您将存储名称和电子邮件ID。并创建该Bean的ArrayList。当您单击任何联系人时,您将从该位置获取联系人姓名和联系人电子邮件ID。 - Sunil Kumar Sahoo
这段代码运行良好,但速度较慢。针对特定联系人如何检索电子邮件地址? - Android Killer
@SunilKumarSahoo - 当我以这种方式从电话簿中读取2000个联系人和电话号码时,它需要30到35秒。是否有其他方法来减少时间? - Ajit Kumar Dubey

5

电话号码

电话号码存储在其专用表格中,需要单独查询。要查询电话号码表,请使用存储在SDK变量ContactsContract.CommonDataKinds.Phone.CONTENT_URI中的URI。使用WHERE条件来获取指定联系人的电话号码。

if (Integer.parseInt(cur.getString(
               cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0) {
            Cursor pCur = cr.query(
         ContactsContract.CommonDataKinds.Phone.CONTENT_URI, 
         null, 
         ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", 
         new String[]{id}, null);
         while (pCur.moveToNext()) {
         // Do something with phones
         } 
         pCur.close();
     }

执行第二个查询,针对Android联系人SQLite数据库。电话号码是根据存储在ContactsContract.CommonDataKinds.Phone.CONTENT_URI中的URI进行查询的。联系人ID存储在电话表中,作为ContactsContract.CommonDataKinds.Phone.CONTACT_ID,WHERE子句用于限制返回的数据。

电子邮件地址

查询电子邮件地址与查询电话号码类似。必须执行查询以从数据库中获取电子邮件地址。查询存储在ContactsContract.CommonDataKinds.Email.CONTENT_URI中的URI以查询电子邮件地址表。

Cursor emailCur = cr.query( 
    ContactsContract.CommonDataKinds.Email.CONTENT_URI, 
    null,
    ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", 
    new String[]{id}, null); 
while (emailCur.moveToNext()) { 
    // This would allow you get several email addresses
        // if the email addresses were stored in an array
    String email = emailCur.getString(
                  emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
     String emailType = emailCur.getString(
                  emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE)); 
 } 
 emailCur.close();

0
 Uri contactData = data.getData();
                Cursor c = getContentResolver().query(contactData, null, null, null, null);
                if (c.moveToFirst()) {
                    String contactId = c.getString(c.getColumnIndex(ContactsContract.Contacts._ID));
                    String hasNumber = c.getString(c.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
                    String email= "";
                    if (Integer.valueOf(hasNumber) == 1) {
                        Cursor numbers = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null);
                        while (numbers.moveToNext()) {
                            email= numbers.getString(numbers.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));
                            //Toast.makeText(getApplicationContext(), "Number=" + num, Toast.LENGTH_LONG).show();

                            //asdasdasdsa
                            if(getEmail(email).isEmpty()){
                                Toast.makeText(this, "Email Not Found In That Contact Try Another", Toast.LENGTH_SHORT).show();
                            }
                            else {
                                edt_email_contact.setText("" + getEmail(email));
                            }                            }
                    }
                }
                break;
            }

0
我正在使用以下代码。它工作得很好。已经检查过了。
ArrayList<ContactInfo> listContactsData = new ArrayList<>();
   // Retrieve Email address 
                Cursor emailCursor = cr.query(
                        ContactsContract.CommonDataKinds.Email.CONTENT_URI,
                        null,
                        ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?",
                        new String[]{id}, null);
                while (emailCursor.moveToNext()) {
                    // This would allow you get email addresses

                    String email = emailCursor.getString(emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));                              String emailType = emailCursor.getString(emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE));
        Log.e(“Email :“,” ”+email)

                    objContact.strEmail = email;
               }
               emailCur.close();

                listContactsData.add(objContact);

0
Uri uri = Uri.withAppendedPath(ContactsContract.Contacts.CONTENT_FILTER_URI,Uri.encode(name.toString().trim()));
Cursor mapContact = getContext().getContentResolver().query(uri, new String[]{PhoneLookup._ID}, null, null, null);
if(mapContact.moveToNext())
{
 String _id = mapContact.getString(mapContact.getColumnIndex(ContactsContract.Contacts._ID));

}

0

这是Sunil答案的Xamarin版本。花了我一些时间,但我终于搞定了。

ContentResolver cr = ContentResolver;
        string contactName = null;
        var cur = cr.Query(ContactsContract.Contacts.ContentUri,null,null,null,null);

        if (cur.MoveToFirst())
        {
            do
            {
                string id = cur.GetString(cur.GetColumnIndex(BaseColumns.Id));
                contactName = cur.GetString(cur.GetColumnIndex(ContactsContract.Contacts.InterfaceConsts.DisplayName));
                var emails = cr.Query(ContactsContract.CommonDataKinds.Email.ContentUri, null, ContactsContract.CommonDataKinds.Email.InterfaceConsts.ContactId + " = " + id, null, null);
                if (emails.MoveToFirst()) {
                    do
                    {
                        // This is where it loops through if there are multiple Email addresses
                        var email = emails.GetString(emails.GetColumnIndex(ContactsContract.CommonDataKinds.Email.InterfaceConsts.Data));
                    } while (emails.MoveToNext());
                }
            } while (cur.MoveToNext());
        }

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接