无法从ContactsContract获取电子邮件地址

3
我试图从ContactsContract中获取电子邮件地址,但我只得到了一个空字符串!姓名和号码都正常工作,但电子邮件地址却不行!
我感到困惑并一直在尝试解决这个问题,但我不知道出了什么问题,或者我在代码中漏掉了什么,也不知道如何解决。
应用程序的这一部分具有来自ContactsContract的所有名称的ListView。在ListView中选择名称时,代码应从ContactsContract获取名称、号码和电子邮件地址。
我希望能得到一些帮助以继续工作!也许有更好的解决方法,请告诉我如何更改!谢谢!
由于toast消息不会在while循环内显示,while(cursorEmail.moveToFirst()){....我猜测电子邮件光标有问题!它似乎是空的!?
public class Activity_3 extends Activity {

ListView listView;

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_3);
    listView = (ListView) findViewById(R.id.contactList);

    String[] projection = { ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, 
            ContactsContract.CommonDataKinds.Phone.NUMBER,
            ContactsContract.CommonDataKinds.Phone._ID };

    Cursor cursor1 = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projection, null, null, null);

    // From column
    String[] fromColumn = { ContactsContract.Contacts.DISPLAY_NAME };
    // To view
    int[] toView = { R.id.contactItem };

    startManagingCursor(cursor1);

    ListAdapter adapter = new SimpleCursorAdapter(this, R.layout.activity_3, cursor1, fromColumn, toView);

    listView.setAdapter(adapter);

    listView.setOnItemClickListener(new OnItemClickListener() {

        public void onItemClick(AdapterView<?> adapter, View view, int position, long id) {

            String[] projection = { ContactsContract.CommonDataKinds.Phone._ID, 
                    ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME, 
                    ContactsContract.CommonDataKinds.Phone.NUMBER,
                    };

            Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projection, null, null, null);

            cursor.moveToPosition(position);

            String contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
            String contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
            String contactNumber = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

            String pos = Integer.toString(position);

            String contactEmailAddress = "?";   
            //Email
            Cursor emails = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + "=" + contactId, null,  null);

            while(emails.moveToNext()){
                contactEmailAddress = emails.getString(emails.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
                Toast.makeText(Activity_3.this, contactEmailAddress, Toast.LENGTH_SHORT).show();
            }
            emails.close();

            Toast.makeText(Activity_3.this, pos + " " + contactId + " " + contactName + " " + contactNumber + " " + contactEmailAddress, Toast.LENGTH_SHORT).show();
        }
    });
}

}

5个回答

12

您需要使用以下代码获取带有详细信息的联系人列表。此方法将返回所有包含姓名、电话号码和电子邮件的联系人。

public ArrayList<ContactDO> getContacts()
{
    ArrayList<ContactDO> alContacts = null;
    Cursor cursor = contResv.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
    if(cursor.moveToFirst())
    {
        alContacts = new ArrayList<ContactDO>();
        do
        {
            //Create a plain class with following variables - id, name, contactNumber, email
            ContactDO objContactDO = new ContactDO();

            objContactDO.name = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));       
            objContactDO.id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));

            Cursor emails = contResv.query(Email.CONTENT_URI,null,Email.CONTACT_ID + " = " + objContactDO.id, null, null);
            while (emails.moveToNext()) 
            { 
                objContactDO.email = emails.getString(emails.getColumnIndex(Email.DATA));
                break;
            }
            emails.close();

            if(Integer.parseInt(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0)
            {
                Cursor pCur = contResv.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?",new String[]{ objContactDO.id }, null);
                while (pCur.moveToNext()) 
                {
                    objContactDO.contactNumber = pCur.getString(pCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                    break;
                }
                pCur.close();
            }

            alContacts.add(objContactDO);

        } while (cursor.moveToNext()) ;
    } 

    cursor.close(); 
    return alContacts;
}
创建自定义适配器并将其设置到列表视图中。
lvContacts.setAdapter(adapter = new CustomContactsAdapter(getContacts()));

太棒了,非常感谢!这些信息比我最初想象的要难找得多。 - Joao Sousa
非常感谢您提供这段代码。在苦苦寻找类似的代码时,它拯救了我的生命。 - JPerk

3
假设您已经获得了要获取电子邮件地址的特定联系人的ID,这里是我之前尝试做同样事情时编写的代码片段:
首先,您需要获取联系人的ID:
    ContentResolver cr  = context.getContentResolver();
    Cursor cursor       = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
    id                  = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));

然后您可以通过以下方式获取电子邮件地址:
            String contactAddress   = "";
            Cursor cursorEmail      = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,
                                            null, 
                                            ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?",
                                            new String[] {id}, 
                                            null);
            if(cursorEmail.moveToFirst()) {
                contactAddress = cursorEmail.getString(cursorEmail.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
            }

请记住,联系人并不一定拥有电子邮件,因此您当然要考虑这一点 :-)
编辑: 仔细查看了您的代码,并将其与我在此处粘贴的内容进行了比较。 看起来你的问题在于参数selectionselectionArgs。 您想做的是获取您正在获取电子邮件地址的联系人的id,然后将选择更改为:
ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?"

在选择参数 selectionArgs 中添加 id,如下所示:
new String[] {id}

嗨!但是我在id下面得到了一条红线? - 3D-kreativ
当你将鼠标悬停在红线上方时,它会显示什么信息? - RvdK
类型不匹配:无法将 long 转换为 String。 - 3D-kreativ
是的,通过那个光标,你应该能够获取到ID :-) - patrickwlarsen
啊哈,但我需要一个新的光标对象才能获取电子邮件!? - 3D-kreativ
显示剩余5条评论

0

在这里,我发布了一个有效的方法,它将通过联系人ID返回您的电子邮件ID或null(如果不可用)。

public static String getEmail(Context c, long id) {
        Uri uri = ContactsContract.CommonDataKinds.Email.CONTENT_URI;
        String[] projection = new String[] {
                ContactsContract.CommonDataKinds.Email._ID,
                ContactsContract.CommonDataKinds.Email.CONTACT_ID,
                ContactsContract.CommonDataKinds.Email.ADDRESS,
                ContactsContract.CommonDataKinds.Email.TYPE };
        String selection = ContactsContract.CommonDataKinds.Email.CONTACT_ID
                + " = '" + id + "'";
        String sortOrder = ContactsContract.CommonDataKinds.Email.ADDRESS
                + " COLLATE LOCALIZED ASC";

        Cursor cursor = c.getContentResolver().query(uri, projection,
                selection, null, sortOrder);

        int index = cursor
                .getColumnIndex(ContactsContract.CommonDataKinds.Email.ADDRESS);
        if (cursor.moveToNext()) {
            return cursor.getString(index);
        }
        return null;
    }

0
ContentResolver cr = this.getContext().getContentResolver();
Cursor cur = cr.query(ContactsContract.Contacts.CONTENT_URI,null, null, null, null);
if (cur.getCount() > 0) {
    while (cur.moveToNext()) {
        String id = cur.getString(cur.getColumnIndex(ContactsContract.Contacts._ID));
        Cursor cur1 = cr.query( 
                ContactsContract.CommonDataKinds.Email.CONTENT_URI, null,
                ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", 
                        new String[]{id}, null); 
        while (cur1.moveToNext()) { 
            //to get the contact names
            String name=cur1.getString(cur1.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME));
            String email = cur1.getString(cur1.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));



        } 
        cur1.close();
    }
}

0

使用这个

String email = "";  
            try {  
                Uri result = data.getData();  
                Log.v(DEBUG_TAG, "Got a contact result: "  
                        + result.toString());  
                // get the contact id from the Uri  
                String id = result.getLastPathSegment();  
                // 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()) {  
                    email = cursor.getString(emailIdx);  
                    Log.v(DEBUG_TAG, "Got email: " + email);  
                } else {  
                    Log.w(DEBUG_TAG, "No results");  
                }  
            } catch (Exception e) {  
                Log.e(DEBUG_TAG, "Failed to get email data", e);  
            } finally {  
                if (cursor != null) {  
                    cursor.close();  
                } 

               edtCustomerEmailid.setText(email);

              //Toast.makeText(getApplicationContext(), email, 1).show();
                if (email.length() == 0) {  
                    Toast.makeText(this, "No email found for contact.",  
                            Toast.LENGTH_LONG).show();  
                }  
            } 

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接