我需要用电子邮件联系人信息(光标)。他们必须是不同的。必须有接触的每一个条目,如果他收到一封电子邮件。怎么做?我打靶新的联系人API自带2.0。
I need to get contacts information(cursor) with email. They must be distinct. There must be one entry per contact if he has got an email. How to do it? I am targetting new contacts API comes with 2.0.
1)我试着用CursorJoiner做到这一点,但一个奇怪的事情发生了。这里是我的code:
1)I tried to do it using CursorJoiner, but a strange thing happens. Here is my code :
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我把它们换成由于隐私问题
now what my problem is i got output like this : in this log its _id | display_name | email id i have replaced them due to privacy issue
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,这是什么跳?
But you can see that it directly jumps from 9 to 90 then all 9 9 9, what is this?
2),我们可以做到这一点使用不同的关键字?是否有可能接触供应商,如ContactsContract?
2) Can we do this using distinct keyword? Is it possible with contact providers like ContactsContract?
尝试使用这个片段:在列表视图中显示联系人的姓名和电子邮件在同一行。
Try using this snippet: Showing Contact name and Email on the same row in list view.
/**
* 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);
}