2011-03-10 68 views
2

我需要通過電子郵件獲取聯繫人信息(光標)。他們必須明確。如果他有電子郵件,每個聯繫人必須有一個條目。怎麼做?我正在瞄準新的聯繫人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

回答

6

請嘗試使用以下代碼段: 在列表視圖的同一行顯示聯繫人姓名和電子郵件。

/** 
* 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

1

我只是碰到了同樣的問題。我知道這個線程很老,但也許這個答案將在未來幫助其他人。

您必須通過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); 
1

只是做它首先找到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(); 
    } 
    } 
} 

這它。

請理解代碼,不要複製粘貼!

相關問題