Получить только адрес электронной почты из списка контактов Android
Я хочу отображать только те имена контактов, адрес электронной почты которых присутствует. В противном случае это имя контакта не должно отображаться в списке. Как я могу это сделать? Кто - нибудь может мне помочь?
6 ответов:
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; }
приведенный выше метод возвращает arraylist имен, который имеет идентификатор электронной почты.
вот мой супер быстрый запрос, чтобы вытащить адреса электронной почты. Это намного быстрее, чем вытягивать все контактные столбцы, как это предлагается другими ответами...
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 секунд, чтобы получить контакты на моем тестовом устройстве, и этот код занял около 0,04 сек.
другое решение.
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 общих столбцов), связанных с определенной учетной записью, поэтому вам может потребоваться сгруппировать их самостоятельно. Мне нужно было это для автозаполнения писем, поэтому формат (email per подряд) было идеальным.
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 Contacts API.
вот простой способ получить идентификатор электронной почты контакта из списка контактов. Вам нужно передать идентификатор контакта пользователя в методе ниже, и он вернет вам идентификатор электронной почты, если он существует
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; }
и если вы хотите узнать, как получить список контактов в приложении, пройдите по этой ссылке: Показать список контактов в приложении android-trinitytuts