从联系人列表Android只获取电子邮件地址

我只想显示其电子邮件地址存在的联系人姓名。 否则,该联系人姓名不应显示在列表中。 我怎样才能做到这一点? 任何人都可以帮我吗?

public ArrayList<String> getNameEmailDetails(){ ArrayList<String> names = new ArrayList<String>(); ContentResolver cr = 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(ContactsContract.Contacts._ID)); Cursor cur1 = cr.query( ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", new String[]{id}, null); while (cur1.moveToNext()) { //to get the contact names String name=cur1.getString(cur1.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); Log.e("Name :", name); String email = cur1.getString(cur1.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); Log.e("Email", email); if(email!=null){ names.add(name); } } cur1.close(); } } return names; } 

上述方法返回具有电子邮件ID的名称的数组列表。

这是我的超快速查询拉电子邮件地址。 这是比其他答案build议拉动所有联系人列更快

 public ArrayList<String> getNameEmailDetails() { ArrayList<String> emlRecs = new ArrayList<String>(); HashSet<String> emlRecsHS = new HashSet<String>(); Context context = getActivity(); ContentResolver cr = context.getContentResolver(); String[] PROJECTION = new String[] { ContactsContract.RawContacts._ID, ContactsContract.Contacts.DISPLAY_NAME, ContactsContract.Contacts.PHOTO_ID, ContactsContract.CommonDataKinds.Email.DATA, ContactsContract.CommonDataKinds.Photo.CONTACT_ID }; String order = "CASE WHEN " + ContactsContract.Contacts.DISPLAY_NAME + " NOT LIKE '%@%' THEN 1 ELSE 2 END, " + ContactsContract.Contacts.DISPLAY_NAME + ", " + ContactsContract.CommonDataKinds.Email.DATA + " COLLATE NOCASE"; String filter = ContactsContract.CommonDataKinds.Email.DATA + " NOT LIKE ''"; Cursor cur = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, PROJECTION, filter, null, order); if (cur.moveToFirst()) { do { // names comes in hand sometimes String name = cur.getString(1); String emlAddr = cur.getString(3); // keep unique only if (emlRecsHS.add(emlAddr.toLowerCase())) { emlRecs.add(emlAddr); } } while (cur.moveToNext()); } cur.close(); return emlRecs; } 

我尝试了“Agarwal Shankar”提供的代码,但花费了大约4秒钟的时间才在我的testing设备上获得联系,这段代码耗时约0.04秒。 这个更快的代码我join了SaluSafe应用程序。 从谷歌播放下载SaluSafe 。

解决scheme

 private static final Uri URI_CONTACT_DATA = ContactsContract.Data.CONTENT_URI; private static final String COLUMN_EMAIL = ContactsContract.CommonDataKinds.Email.ADDRESS; private static final String COLUMN_DISPLAY_NAME = ContactsContract.Contacts.DISPLAY_NAME_PRIMARY; private static final String COLUMN_MIMETYPE = ContactsContract.Data.MIMETYPE; private static final String[] PROJECTION = { COLUMN_DISPLAY_NAME, COLUMN_EMAIL, COLUMN_MIMETYPE }; private Cursor getCursor() { ContentResolver resolver = context.getContentResolver(); String selection = COLUMN_MIMETYPE + "=?"; final String[] selectionArgs = {ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE}; return resolver.query(URI_CONTACT_DATA, PROJECTION, selection, selectionArgs, null); } 

问题是ContactsContract.Contacts.CONTENT_URI中的表包含整个联系人数据库 。 这包括电话号码,电子邮件,组织,甚至完全自定义的数据,所以你不能使用它与ContactsContract.Data.MIMETYPE过滤。 此数据库中的某行包含与某个帐户相关的值(或值,它具有15个通用列),因此您可能需要自己对其进行分组。 我需要这个来自动完成电子邮件,所以格式(电子邮件每行)是完美的。

 if (cur.getCount() > 0) { while (cur.moveToNext()) { String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID)); String name = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)); Cursor emailCur = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,null,ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", new String[]{id},null); while (emailCur.moveToNext()) { String email = emailCur.getString( emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)); Log.e("Email",name+" "+email); } emailCur.close(); } } 

如果您已经可以获取联系人和他们的电子邮件地址(如果存在),为什么不从您的列表中删除没有电子邮件地址的联系人?

有关Android联系人API的更多信息,请参阅此处 。

这是从联系人列表中获取联系人的电子邮件ID的简单方法。 你需要在下面的方法中传递用户的联系人ID,如果存在,它会返回你的电子邮件ID

  public String getEmail(String contactId) { String emailStr = ""; final String[] projection = new String[]{ContactsContract.CommonDataKinds.Email.DATA, ContactsContract.CommonDataKinds.Email.TYPE}; Cursor emailq = managedQuery(ContactsContract.CommonDataKinds.Email.CONTENT_URI, projection, ContactsContract.Data.CONTACT_ID + "=?", new String[]{contactId}, null); if (emailq.moveToFirst()) { final int contactEmailColumnIndex = emailq.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA); while (!emailq.isAfterLast()) { emailStr = emailStr + emailq.getString(contactEmailColumnIndex) + ";"; emailq.moveToNext(); } } return emailStr; } 

而且,如果你想学习如何获得你的应用程序中的联系人列表,请按照以下链接: 在应用程序中显示联系人列表 – trinitytuts