通过电子邮件ID获取联系人

问题描述:

我需要通过电子邮件获取联系人信息(光标)。他们必须明确。如果他有电子邮件,每个联系人必须有一个条目。怎么做?我正在瞄准新的联系人API 2.0。通过电子邮件ID获取联系人

1)我试图用CursorJoiner来做,但发生了一件奇怪的事情。这里是我的代码:

MatrixCursor matCur = new MatrixCursor(
      new String[]{ 
      Contacts._ID, 
       Contacts.DISPLAY_NAME, 
       "photo_id", 
       "starred" 
      } 
     ); 

Cursor newContactCursor = managedQuery(
     ContactsContract.Contacts.CONTENT_URI, 
      new String[]{ 
       Contacts._ID, 
       Contacts.DISPLAY_NAME, 
       "photo_id", 
       "starred" 
      }, 
      null, 
      null, 
      null//Contacts._ID 
     ); 

newContactCursor.moveToFirst(); 

Cursor emailCur = managedQuery(
     ContactsContract.CommonDataKinds.Email.CONTENT_URI, 
      new String[] { 
       Email.CONTACT_ID, 
       Email.DATA1 
      }, 
      null, 
      null, 
      Email.CONTACT_ID 
     ); 

      emailCur.moveToFirst(); 

CursorJoiner joiner = new CursorJoiner(
     newContactCursor, 
      new String[]{Contacts._ID}, 
      emailCur, 
      new String[] {Email.CONTACT_ID} 
     ); 

for (CursorJoiner.Result joinerResult : joiner) { 
     switch (joinerResult) { 

     case LEFT: 
     // handle case where a row in cursorA is unique 
     //Log.i(TAG,"L|"+ 
     //newContactCursor.getString(newContactCursor.getColumnIndex("_id"))); 

     break; 

     case RIGHT: 
     // handle case where a row in cursorB is unique 
     //Log.i(TAG, 
     //"R|"+ 
     //emailCur.getString(emailCur.getColumnIndex("contact_id"))); 

     break; 

     case BOTH: 

     //Log.i(TAG, 
     //"L|"+ 
     //newContactCursor.getString(newContactCursor.getColumnIndex("_id"))+ 
     //"|R|"+ 
     //emailCur.getString(emailCur.getColumnIndex("contact_id"))); 

       Log.i(TAG,           newContactCursor.getString(newContactCursor.getColumnIndex("_id"))+"|"+ 
          newContactCursor.getString(newContactCursor.getColumnIndex("display_name"))+"|"+ 
          emailCur.getString(emailCur.getColumnIndex(Email.DATA1))); 

        String[] columnValues = 
        {newContactCursor.getString(newContactCursor.getColumnIndex("_id")), 
          newContactCursor.getString(newContactCursor.getColumnIndex("display_name")), 
          newContactCursor.getString(newContactCursor.getColumnIndex("photo_id")), 
          newContactCursor.getString(newContactCursor.getColumnIndex("starred")) 
        }; 

        matCur.addRow(columnValues); 

        break; 
       } 
      } 

我现在的问题是我得到这样的输出: 在此记录其_id | display_name |电子邮件ID 我让他们换成由于隐私问题

1|[contact name]|[email id] 
4|[contact name]|[email id] 
5|[contact name]|[email id] 
6|[contact name]|[email id] 
7| 
8| 
9| 
90| 
91| 
92| 
93| 
94| 
95| 
96| 
97| 
98| 
99| 

但是你可以看到,它直接从9跳跃到90,那么所有9 9 9,这是什么?

2)我们可以使用不同的关键字吗?与ContactsContract之类的联系人提供商有可能吗?

+0

任何人都可以添加标签CursorJoiner? – 2011-03-11 04:15:23

请尝试使用以下代码段: 在列表视图的同一行显示联系人姓名和电子邮件。

/** 
* Populate the contact list based on account. 
*/ 
private void populateContactList() { 
    // Build adapter with contact entries 

    Cursor cursorEmail = getContactsEmail();//get all emails 

    String[] fields = new String[] //fields of data to take 
    {  ContactsContract.Contacts._ID, 
      ContactsContract.Data.DISPLAY_NAME, 
      ContactsContract.CommonDataKinds.Email.DATA 
    }; 
    SimpleCursorAdapter adapter = 
      new SimpleCursorAdapter(this, R.layout.contact_entry, cursorEmail , 
      fields, new int[] 
         {R.id.UID,R.id.contactEntryText,R.id.contactEmail}); 
    mContactList.setAdapter(adapter); 
} 

/** 
* Obtains the contact list for the currently selected account. 
* 
* @return A cursor for for accessing the contact list. 
*/ 
private Cursor getContactsEmail() 
{ 
    // Run query 
    Uri uri = ContactsContract.CommonDataKinds.Email.CONTENT_URI; 
    String[] projection = new String[] { 
      ContactsContract.Contacts._ID, 
      ContactsContract.Contacts.DISPLAY_NAME, 
      ContactsContract.CommonDataKinds.Email.DATA 
    }; 
    String selection = ContactsContract.Contacts.IN_VISIBLE_GROUP +"='1'"; 
    //showing only visible contacts 
    String[] selectionArgs = null; 
    String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"; 
    return managedQuery(uri, projection, selection, selectionArgs, sortOrder); 
} 
+0

我认为这将显示同一联系人的多个条目,如果他有多个电子邮件ID。我对吗?我需要独特的。 – 2011-09-06 06:47:17

+0

是的,它会显示联系人每封电子邮件的多个条目... – MaTriXy 2011-09-06 12:51:14

+0

所以任何解决方法?我需要获得电子邮件的联系人姓名 – 2011-09-07 04:28:16

我只是碰到了同样的问题。我知道这个线程很老,但也许这个答案将在未来帮助其他人。

您必须通过MIME类型过滤掉重复项。这是我做的:

Uri contacts = ContactsContract.Data.CONTENT_URI; 

String[] projection = new String[] { 
     ContactsContract.Contacts._ID, 
     ContactsContract.Contacts.LOOKUP_KEY, 
     ContactsContract.Contacts.DISPLAY_NAME 
}; 

String selection = 
     ContactsContract.Contacts.IN_VISIBLE_GROUP + " = ? AND " + 
     ContactsContract.Contacts.DISPLAY_NAME + " LIKE ?" + " AND " + 
     ContactsContract.Data.MIMETYPE + "='" + 
     ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE + "'"; 

String sortOrder = ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC"; 

mContactCursor = managedQuery(
     contacts, 
     projection, 
     selection, 
     new String[] {"1", constraint.toString() + '%'}, 
     sortOrder); 

只是做它首先找到CONTACT_ID的简单方法 ,在它的基础上,我们将搜索联系人相关的所有email_ids。 上的任何按钮单击事件编写代码

Intent intent = new Intent(Intent.ACTION_GET_CONTENT); 
intent.setType(ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE); 
startActivityForResult(intent, 2); 
现在

上的活动结果,

protected void onActivityResult(int requestCode, int resultCode, Intent data) 
{ 
    System.out.println("Request Code--"+requestCode); 
    super.onActivityResult(requestCode, resultCode, data); 
    if (data != null && requestCode == 2) 
    { 
      fromCurrent = true; 
      Uri uri = data.getData(); 
      //fromCurrent=true; 
      if (uri != null) { 
       Cursor c = null; 
       try { 
        c = getContentResolver().query(uri, new String[]{ 
           ContactsContract.CommonDataKinds.Phone.CONTACT_ID, 
           ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, 
           ContactsContract.CommonDataKinds.Email.DATA , 
           ContactsContract.CommonDataKinds.Email.TYPE }, 
          null, null, null); 

        if (c != null && c.moveToFirst()) { 
         String id = c.getString(0); 
         String name = c.getString(1); 

         System.out.println("id "+id+" name:"+name); 

         ContactID = id; 
         retriveEmail(); 


         if(arrEmail.size() == 0) 
         { 
          showToast("No Email Address found for the selected contact!"); 
         } 
         else 
         { 
         ListFile = arrEmail.toArray(new String[arrEmail.size()]); 

          builder1 = new AlertDialog.Builder(ShareTheHeart_Activity.this); 

          builder1.setTitle("Select an email address :"); 

          builder1.setSingleChoiceItems(ListFile,-1,new DialogInterface.OnClickListener() {  //@Override 
         public void onClick(DialogInterface dialog, int which) 
         { 
          txtEmail.setText(ListFile[which]); 
          alert.cancel(); 
          } 
         }); 

          alert = builder1.create(); 
          alert.show();  

         } 
        } 
       } finally { 
        if (c != null) { 
         c.close(); 
        } 
       } 
      } 
     } 
} 

其中retriveEmail创建方法,这种方式写在你的代码,

private void retriveEmail() 
{ 
    try { 
     arrEmail = new ArrayList<String>(); 
    String id = ContactID; 

    // query for everything email 
    cursor = getContentResolver().query(Email.CONTENT_URI, 
      null, Email.CONTACT_ID + "=?", new String[] { id }, 
      null); 

    int emailIdx = cursor.getColumnIndex(Email.DATA); 

    // let's just get the first email 
    if (cursor.moveToFirst()) 
    { 
    do{ 
     email = cursor.getString(emailIdx); 
     arrEmail.add(email); 
     Log.v("ABC", "Got email: " + email); 
    } while(cursor.moveToNext()); 
    } else { 
     Log.w("ABC", "No results"); 
    } 

} catch (Exception e) { 
    Log.e("ABC", "Failed to get email data", e); 
} finally { 
    if (cursor != null) { 
     cursor.close(); 
    } 
    } 
} 

这它。

请理解代码,不要复制粘贴!