Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/android/225.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Android 获取具有电子邮件id的联系人_Android_Email_Cursor_Contactscontract - Fatal编程技术网

Android 获取具有电子邮件id的联系人

Android 获取具有电子邮件id的联系人,android,email,cursor,contactscontract,Android,Email,Cursor,Contactscontract,我需要通过电子邮件获取联系人信息(光标)。它们必须是不同的。如果联系人收到电子邮件,则每个联系人必须有一个条目。怎么做?我的目标是2.0版API附带的新联系人 1) 我试着用CursorJoiner来做,但奇怪的事情发生了。这是我的密码: MatrixCursor matCur = new MatrixCursor( new String[]{ Contacts._ID, Contacts.DISPLAY_NAME,

我需要通过电子邮件获取联系人信息(光标)。它们必须是不同的。如果联系人收到电子邮件,则每个联系人必须有一个条目。怎么做?我的目标是2.0版API附带的新联系人

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 |显示|名称|电子邮件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,这是什么

2) 我们可以使用distinct关键字执行此操作吗?像ContactsContract这样的联系人提供商可以吗?

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

 /**
 * 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);
}

我也遇到了同样的问题。我知道这条线索很古老,但也许这个答案将来会帮助别人

必须按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);
只要用简单的方法做就行了 首先查找联系人id,在此基础上,我们将搜索与该联系人相关的所有电子邮件id。 在任何按钮上单击事件写入此代码

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();
                    }
                }
            }
        }
}
在创建RetrieveEmail方法的地方,以这种方式在代码中编写它

  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();  
    }   
    }
}
private void retrieveemail()
{
试试{
arrEmail=newarraylist();
字符串id=联系人id;
//查询电子邮件中的所有内容
cursor=getContentResolver().query(Email.CONTENT\u URI,
null,Email.CONTACT_ID+“=?”,新字符串[]{ID},
无效);
int emailIdx=cursor.getColumnIndex(Email.DATA);
//让我们先收到第一封电子邮件
if(cursor.moveToFirst())
{
做{
email=cursor.getString(emailIdx);
arrEmail.add(电子邮件);
Log.v(“ABC”,“收到电子邮件:+电子邮件”);
}while(cursor.moveToNext());
}否则{
Log.w(“ABC”,“无结果”);
}  
}捕获(例外e){
Log.e(“ABC”,“无法获取电子邮件数据”,e);
}最后{
如果(游标!=null){
cursor.close();
}   
}
}
就这样


请理解代码,不要只是复制和粘贴

任何人都可以添加标签CursorJoiner吗?我认为如果他有多个电子邮件ID,这将显示同一联系人的多个条目。我说得对吗?我需要特别的,有什么解决办法吗?我需要有电子邮件集的联系人姓名,他们不允许重复密钥。我没有运行Leon的代码,但他的论点似乎是合法的,因此接受了他的答案,尽管现在managedQuery没有用。