【问题标题】:Get only email address from contact list Android仅从联系人列表 Android 中获取电子邮件地址
【发布时间】:2012-04-12 03:35:55
【问题描述】:

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

【问题讨论】:

    标签: android


    【解决方案1】:

    这是我提取电子邮件地址的超快速查询。这比其他答案建议的拉所有联系人列要快得多...

    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 秒。

    【讨论】:

    • 终极答案.. 必须使用这个
    • order变量中的sql命令是什么意思?尤其是“THEN 1 ELSE 2”有点混乱。
    • 我对其进行了测试,它适用于大多数设备,但在我的 LG G3 5.0 上,这不起作用!!!
    • 嗨,我编写了相同的查询来获取存在 sip 地址的联系人姓名。但它不起作用。当 sip 地址不存在时,我无法弄清楚 sip 地址的内容解析器默认值是什么
    • @douarbou 我不确定你是否还需要它,但我对 LG G3 有同样的问题,你可以通过在过滤器中用“”替换“不喜欢”来解决它
    【解决方案2】:
    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 的名称数组列表。

    【讨论】:

    • 我在 ArrayList 中获取联系人姓名和电子邮件地址。我在日志猫中看到这样的:姓名:abc@gmail.com,电子邮件:abc@gmail.com,姓名:xyz@gmai.com,电子邮件:xyz@gmail.com,姓名:xyz,电子邮件:xyz@gmail。 com。意味着我在联系人姓名中混合了姓名和电子邮件地址:(
    • 它没有给出名称。它只提供电子邮件 ID
    • 别忘了添加“读取联系人”权限:
    • 使用 Marcin 的答案,它的表现更好!
    • 谢谢。这帮我..:)
    【解决方案3】:
    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();
                  }
    
              }
    

    【讨论】:

      【解决方案4】:

      另一种解决方案。

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

      【讨论】:

        【解决方案5】:

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

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

        【讨论】:

        • 嘿,谢谢 IrAndroid。是的,我只是这样做。但我得到了所有的联系人姓名。你能告诉我一些代码吗?
        • 这是一个与您所问问题类似的问题:stackoverflow.com/questions/5205999/…
        • 嘿,我试过这个链接上给出的代码。但我收到了电子邮件地址。不是名字。如果电子邮件地址存在,我想获取联系人姓名。你能给我一些代码吗?这样我就可以得到一些想法。
        【解决方案6】:

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

        如果您想了解如何在您的应用中获取联系人列表,请点击此链接:show contact list in app android - trinitytuts

        【讨论】:

          【解决方案7】:

          声明一个全局变量

          // Hash Maps
          Map<String, String> nameEmailMap = new HashMap<String, String>();
          

          然后使用下面的函数

          private void getEmailIDs() {
          
              Cursor emails = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, null, null, null);
          
              // Loop Through All The Emails
              while (emails.moveToNext()) {
          
                  String name = emails.getString(emails.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
                  String email = emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.ADDRESS));
          
                  // Enter Into Hash Map
                  nameEmailMap.put(email, name);
          
              }
          
              // Get The Contents of Hash Map in Log
              for (Map.Entry<String, String> entry : nameEmailMap.entrySet()) {
                  String key = entry.getKey();
                  Log.d(TAG, "Email :" + key);
                  String value = entry.getValue();
                  Log.d(TAG, "Name :" + value);
              }
              emails.close();
          }
          

          请记住,在上面的示例中,键是电子邮件,值是名称,因此请阅读您的内容,例如 mahaXXXX@gmail.com->Mahatma Gandhi 而不是 Mahatma Gandhi->mahaXXXX@gmail.com

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2018-11-14
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2011-11-30
            • 1970-01-01
            相关资源
            最近更新 更多