java - 如何从android中的联系人读取电子邮件字段?
问题描述
在我的应用程序中,我将手机中的所有联系人读取到列表视图中。单击列表中的特定视图后,我想阅读姓名、电话和电子邮件地址。我设法毫无问题地阅读了姓名和电话。但我无法收到电子邮件。
假设我有 2 个联系人:
Bill
55-555-555
bil@example.com
Mark
66-666-666
mark@example.com
因此电子邮件的字段称为反向。对于比尔,我收到马克的电子邮件,对于马克,我收到比尔的电子邮件。其他数值正确。
private HashMap<String,String> getContactNames()
{
HashMap<String,String>contact=new HashMap<>();
ContentResolver cr = getContentResolver();
Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
cursor.moveToPosition(pos_listView);
String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
Cursor phones = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null);
phones.moveToPosition(pos_listView);
String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
Cursor emailcur = getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, null,null, null);
emailcur.moveToPosition(pos_listView);
String email = emailcur.getString(emailcur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA1));
contact.put("name",name);
contact.put("phoneNumber",phoneNumber);
contact.put("email",email);
cursor.close();
return contact;
}
解决方案
不,这绝对不是它的工作方式。
ContactsContract API 中有 3 个不同的表:
- 联系人
- 原始联系人
- 数据(您可以通过 直接访问,也可以
Data.CONTENT_URI
通过辅助子表通过Phone.CONTENT_URI
、Email.CONTENT_URI
等访问)
联系人列表中联系人的位置与联系人的位置无关,如果其电话或电子邮件在他们的表格中,因此moveToPosition(pos_listView)
是非常错误的。
这是你应该做的:
- 阅读所有联系人列表时,跟踪他们的联系人 ID 的通过
Contacts._ID
,并确保在单击联系人时可以获取它 - 单击联系人时,获取其联系人 ID,并将其发送到您的方法。
- 在您的联系信息方法中,只查询一次所有电话和电子邮件(如果需要,可能还有更多信息)以一次获取它们。
然后,您的方法将如下所示:
private void getContactInfo(long contactId) {
String[] projection = {Data.DISPLAY_NAME, Data.MIMETYPE, Data.DATA1};
String selection = Data.CONTACT_ID + "=" + contactId + " AND " + Data.MIMETYPE + " IN ('" + Phone.CONTENT_ITEM_TYPE + "', '" + Email.CONTENT_ITEM_TYPE + "')";
Cursor cur = cr.query(Data.CONTENT_URI, projection, selection, null, null);
Log.i(TAG, "dumping info for contact id: " + contactId);
while (cur.moveToNext()) {
String name = cur.getString(0);
String mime = cur.getString(1); // type of data: email, phone, company, etc.
String data = cur.getString(2); // the actual info, e.g. +1-212-555-1234
String type = Phone.CONTENT_ITEM_TYPE.equals(mime) ? "phone" : "email";
Log.i(TAG, "info: " + name + " - " + type + ": " + data);
}
cur.close();
}