2012-04-12 165 views

回答

62
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的名称的数组列表。

+0

嘿非常感谢 – 2012-04-12 05:33:26

+0

我在ArrayList中获取联系人姓名和电子邮件地址。我看到这样的日志猫:名称:[email protected],电子邮件:[email protected],姓名:[email protected],电子邮件:[email protected],姓名:xyz,电子邮件:xyz @ gmail。 COM。这意味着我得到混合名称和电子邮件地址在联系人名称:( – 2012-04-12 05:44:29

+0

试试这个备用工作答案 – 2012-04-12 06:50:49

0

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

有关Android Contacts API的更多信息,请参阅here

+0

嘿谢谢IrAndroid。是的,我只是这样做的。但我得到所有联系人的名字。你能告诉我一些代码吗? – 2012-04-12 03:42:14

+0

这里有一个类似的问题,你在问什么:http://stackoverflow.com/questions/5205999/android-get-a-cursor-only-with-contacts-that-have-an-email-listed-android-2 -0。 – lrAndroid 2012-04-12 03:43:11

+0

嘿,我试过这个链接给出的代码。但我正在收到电子邮件地址。不是名字。如果电子邮件地址存在,我想获取联系人姓名。你能给我一些代码吗?这样我可以得到一些想法。 – 2012-04-12 04:37:01

1
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(); 
       } 

      } 
+0

再次感谢Agarwal :) – 2012-04-12 08:54:33

109

这是我的超级快速查询拉电子邮件地址。这是不是拉的所有联系列由其他答案的建议快得多......

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; 
} 

我试图通过“阿加瓦尔香卡”提供的代码,但它花了约4秒,让我在测试设备上的接触,这代码耗时约0.04秒。这个更快的代码我加入了SaluSafe应用程序。 Download SaluSafe from google play

+0

终极答案..必须使用这一个 – 2013-06-13 10:00:02

+0

超快速,比其他解决方案快得多。 – 2013-07-06 13:28:03

+0

这应该是答案。不是另一个。 +1 – alicanbatur 2014-01-14 09:31:37

0

以下是从联系人列表中获取联系人的电子邮件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; 
} 

如果您想了解如何在您的应用程序获取联系人列表请点击此链接也将返回你的电子邮件ID:show contact list in app android - trinitytuts

2

另一种解决方案。

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个通用列),因此您可能需要自己对它们进行分组。我需要这个来自动完成电子邮件,所以格式(每行电子邮件)是完美的。

相关问题