获取与电子邮件ID接触电子邮件、ID

2023-09-06 05:36:34 作者:我有病,你有药吗?

我需要用电子邮件联系人信息(光标)。他们必须是不同的。必须有接触的每一个条目,如果他收到一封电子邮件。怎么做?我打靶新的联系人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)我试着用Cu​​rsorJoiner做到这一点,但一个奇怪的事情发生了。这里是我的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);
}