2011-03-10 5 views
2

이메일과 연락처 정보 (커서)를 가져와야합니다. 그들은 분명해야합니다. 그가 이메일을 가지고 있다면 연락 당 하나의 항목이 있어야합니다. 그것을하는 방법? 나는 새로운 연락처 API를 2.0 표적으로하고있다.이메일 ID가있는 연락처 가져 오기

1) CursorJoiner를 사용하여 시도했지만 이상한 일이 발생합니다. |의 _id 로그이에 :

내 문제는 내가이 같은 결과를 얻었다 무엇인지 지금
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; 
       } 
      } 

: 여기 내 코드입니다 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 9 9이 무엇 전부입니다 90 9에서 점프 것을 볼 수 있습니까?

2) 고유 키워드를 사용하여이 작업을 수행 할 수 있습니까? ContactsContract와 같은 컨택 제공자가 가능합니까?

+0

누구나 CursorJoiner 태그를 추가 할 수 있습니까? –

답변

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

이메일 주소가 여러 개인 경우 동일한 연락처의 여러 항목이 표시됩니다. 내가 맞습니까? 나는 뚜렷이 필요하다. –

+0

네, 그 연락처에있는 각 이메일에 대해 여러 항목을 표시합니다 ... – MaTriXy

+0

그래서 그 모든 해결 방법은? 이메일을 가지고있는 담당자 이름이 필요합니다. –

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

단지 우리가 그 연락처에 관련된 모든 email_ids를 검색합니다 그것의 기준으로 모든 찾을 contact_id의 첫번째 간단한 방법 에 그것을 할. 아무 버튼 클릭 이벤트에 것은

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

의 그 코드에서이 방법을 쓰기이 코드 활동 성과에 지금

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

, retriveEmail이 방법을 만들어

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

쓰기 그것.

코드를 이해하고 복사하여 붙여 넣기 만하면 안됩니다!

관련 문제