ContactsContract.CommonDataKinds.StructuredName 的问题
Posted
技术标签:
【中文标题】ContactsContract.CommonDataKinds.StructuredName 的问题【英文标题】:Problems with ContactsContract.CommonDataKinds.StructuredName 【发布时间】:2011-05-20 23:40:12 【问题描述】:在查询联系人数据时,我得到了大部分工作。我正在与结构化名称和组织作斗争。它们不适合我。
如果您不介意,请查看代码。它是手工制作的,并且删除了许多错误检查,以使其尽可能小,以便在此处发布。带有“不工作”的评论是对我不起作用的部分。
两个前导 if() 是 onActivityResult 的一部分,我在联系人选择结束时接收数据。调用完成:
intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(intent, Main.DIALOG_PICKCONTACT);
非常感谢提前 哈杰维
if (requestCode == Main.DIALOG_PICKCONTACT)
if (resultCode == RESULT_OK)
int i;
String s;
Cursor cursorContacts = managedQuery(intent.getData(),
null,
null,
null,
null);
if (cursorContacts != null)
if (cursorContacts.moveToNext())
ContentResolver contentResolver = getContentResolver();
String contactId = cursorContacts.getString(cursorContacts.getColumnIndex(ContactsContract.Contacts._ID));
i = cursorContacts.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
// cursorContacts.getString(i); *** is DISPLAY_NAME
Cursor cursorEmail = contentResolver.query(
ContactsContract.CommonDataKinds.Email.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?",
new String[] contactId ,
null);
if (cursorEmail != null)
while (cursorEmail.moveToNext())
int type = cursorEmail.getInt(cursorEmail.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE));
s = cursorEmail.getString(cursorEmail.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
switch (type)
case ContactsContract.CommonDataKinds.Email.TYPE_HOME:
// s *** is private Email
break;
case ContactsContract.CommonDataKinds.Email.TYPE_WORK:
// s *** is business Email
break;
cursorEmail.close();
Cursor cursorOrganization = contentResolver.query(
ContactsContract.Data.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Organization.CONTACT_ID + " = ?",
new String[] contactId ,
null);
if (cursorOrganization != null)
if (cursorOrganization.moveToNext())
s = cursorOrganization.getString(cursorOrganization.getColumnIndex(ContactsContract.CommonDataKinds.Organization.DATA));
// s *** Company name not working
s = cursorOrganization.getString(cursorOrganization.getColumnIndex(ContactsContract.CommonDataKinds.Organization.TITLE));
// s *** Function within company not working
cursorOrganization.close();
s = cursorContacts.getString(cursorContacts.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
if (Integer.parseInt(s) > 0)
Cursor cursorPhone = contentResolver.query(
ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = ?",
new String[] contactId ,
null);
if (cursorPhone != null)
while (cursorPhone.moveToNext())
int type = cursorPhone.getInt(cursorPhone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
s = cursorPhone.getString(cursorPhone.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
switch (type)
case ContactsContract.CommonDataKinds.Phone.TYPE_FAX_HOME:
// s *** is private fax
break;
case ContactsContract.CommonDataKinds.Phone.TYPE_FAX_WORK:
// s *** is business fax
break;
case ContactsContract.CommonDataKinds.Phone.TYPE_HOME:
// s *** is private phone
break;
case ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE:
// s *** is mobile phone
break;
case ContactsContract.CommonDataKinds.Phone.TYPE_WORK:
// s *** is business phone
break;
case ContactsContract.CommonDataKinds.Phone.TYPE_WORK_MOBILE:
// s *** is business mobile
break;
cursorPhone.close();
Cursor cursorStructuredName = contentResolver.query(
ContactsContract.Data.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.StructuredName.CONTACT_ID + " = ?",
new String[] contactId ,
null);
if (cursorStructuredName != null)
if (cursorStructuredName.moveToNext())
i = cursorStructuredName.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME);
// cursorStructuredName.getString(i); *** given name not working
i = cursorStructuredName.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME);
// cursorStructuredName.getString(i); *** middle name not working
i = cursorStructuredName.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.PREFIX);
// cursorStructuredName.getString(i); *** prefix not working
i = cursorStructuredName.getColumnIndex(ContactsContract.CommonDataKinds.StructuredName.SUFFIX);
// cursorStructuredName.getString(i); *** suffix not working
cursorStructuredName.close();
Cursor cursorStructuredPostal = contentResolver.query(
ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.StructuredPostal.CONTACT_ID + " = ?",
new String[] contactId ,
null);
if (cursorStructuredPostal != null)
while (cursorStructuredPostal.moveToNext())
int type = cursorStructuredPostal.getInt(cursorStructuredPostal.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.TYPE));
s = cursorStructuredPostal.getString(cursorStructuredPostal.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY));
switch (type)
case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME:
//s *** is private country
break;
case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK:
// s *** is business country
break;
s = cursorStructuredPostal.getString(cursorStructuredPostal.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY));
switch (type)
case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME:
// s *** is private city
break;
case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK:
// s *** is business city
break;
s = cursorStructuredPostal.getString(cursorStructuredPostal.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE));
switch (type)
case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME:
// s *** is private postcode
break;
case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK:
// s *** is business postcode
break;
s = cursorStructuredPostal.getString(cursorStructuredPostal.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET));
switch (type)
case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_HOME:
// s *** is private street
break;
case ContactsContract.CommonDataKinds.StructuredPostal.TYPE_WORK:
// s *** is business street
break;
cursorStructuredPostal.close();
Cursor cursorWebsite = contentResolver.query(
ContactsContract.Data.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Website.CONTACT_ID + " = ?",
new String[] contactId ,
null);
if (cursorWebsite != null)
while (cursorWebsite.moveToNext())
i = cursorWebsite.getColumnIndex(ContactsContract.CommonDataKinds.Website.URL);
int type = cursorWebsite.getColumnIndex(ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE);
s = cursorWebsite.getString(i);
switch (type)
case ContactsContract.CommonDataKinds.Website.TYPE_HOME:
// s *** private url not working
break;
case ContactsContract.CommonDataKinds.Website.TYPE_WORK:
// s *** business url not working
break;
cursorWebsite.close();
cursorContacts.close();
【问题讨论】:
嗨,干得好。你有获取组织数据的解决方案吗?提前致谢。 【参考方案1】:你的 where 条件是错误的。
将此用于结构化名称:
// projection
String[] projection = new String[] ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME;
String where = ContactsContract.Data.RAW_CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?";
String[] whereParameters = new String[]this.contact_id, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE;
//Request
Cursor contacts = this.resolver.query(ContactsContract.Data.CONTENT_URI, projection, where, whereParameters, null);
//Iteration
if (contacts.moveToFirst())
//code here
contacts.close();
【讨论】:
抱歉,回复晚了。几个星期都没用,所以我放弃了。在您的帮助下,我进行了更多的重新调查,并进行了很多更改和尝试,我可以使大部分工作(而不是网站)。非常感谢。但是,一定有什么不对劲。缺少几个别名:例如 ContactsContract.CommonDataKinds.StructuredName.CONTENT_URI 和 ContactsContract.CommonDataKinds.Website.CONTENT_URI。此别名确实存在于所有其他:ContactsContract.CommonDataKinds.Email.CONTENT_URI 或 ContactsContract.CommonDataKinds.Phone.CONTENT_URI - 仅提及两个。 巧妙!如果可以的话,我会加你两次,你解决了我 1 小时的战斗问题! 这帮助我解决了给定/姓氏分别为 1/null 的问题。对我来说关键是 where 子句需要包含 AND " + ContactsContract.Data.MIMETYPE + " = ?或者它没有得到正确的行并给我不正确的数据。【参考方案2】:找不到完整的解决方案如何获取从联系人中挑选的人的名字、姓氏、中间名和生日。所以这是我的解决方案:
显示联系人列表:
Intent intent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI);
startActivityForResult(intent, GET_PHONE_ADDRESS_BOOK_CONST);
获取联系人:
@Override
public void onActivityResult(int requestCode, int resultCode, Intent data)
if (resultCode == Activity.RESULT_OK)
switch (requestCode)
case GET_PHONE_ADDRESS_BOOK_CONST:
getContactFromAddressBook(data);
break;
default:
break;
super.onActivityResult(requestCode, resultCode, data);
获取联系人 ID:
private void getContactFromAddressBook(Intent data)
if (data != null)
Uri uri = data.getData();
if (uri != null)
Cursor c = null;
try
c = getActivity().getContentResolver().query(uri,
null, null, null, null);
if (c != null && c.moveToFirst())
String id = c.getString(c.getColumnIndex(ContactsContract.Contacts._ID));
getFullName(id);
getBirthday(id);
catch(Exception e)
Utils.Loge(e.getMessage(), e);
finally
if (c != null)
c.close();
获取名字、姓氏和中间名
private HashMap<String, String> getFullName(String id)
HashMap<String, String> ret = new HashMap<String, String>();
String whereName = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?";
String[] whereNameParams = new String[] id, ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE ;
Cursor c = null;
try
c = getActivity().getContentResolver().query(ContactsContract.Data.CONTENT_URI, null, whereName, whereNameParams, null);
if (c != null && c.moveToFirst())
int indexGivenName = c.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME);
int indexFamilyName = c.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME);
int indexDisplayName = c.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME);
ret.put(ContactsContract.CommonDataKinds.StructuredName.GIVEN_NAME, c.getString(indexGivenName));
ret.put(ContactsContract.CommonDataKinds.StructuredName.FAMILY_NAME, c.getString(indexFamilyName));
ret.put(ContactsContract.CommonDataKinds.StructuredName.MIDDLE_NAME, c.getString(indexDisplayName));
catch(Exception e)
Utils.Loge(e.getMessage(), e);
finally
if (c != null)
c.close();
return ret;
过生日
private Date getBirthday(String id)
Date date = null;
String whereName = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ? AND " + ContactsContract.CommonDataKinds.Event.TYPE + " = ?";
String[] whereNameParams = new String[] id, ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE, String.valueOf(ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY) ;
Cursor c = null;
try
c = getActivity().getContentResolver().query(ContactsContract.Data.CONTENT_URI, null, whereName, whereNameParams, null);
if (c != null && c.moveToFirst())
int indexBirthday = c.getColumnIndexOrThrow(ContactsContract.CommonDataKinds.Event.START_DATE);
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd", Locale.US);
date = format.parse(c.getString(indexBirthday));
catch(Exception e)
Utils.Loge(e.getMessage(), e);
finally
if (c != null)
c.close();
return date;
【讨论】:
【参考方案3】:private String getWebsite(String contactId)
String[] cols = ContactsContract.CommonDataKinds.Website.URL ;
String filter = ContactsContract.Data.CONTACT_ID+" = ? " +
" and "+ContactsContract.Data.MIMETYPE
+" = '"+ContactsContract.CommonDataKinds.Website.CONTENT_ITEM_TYPE+"'";
String[] params = String.valueOf(contactId) ;
Cursor website = act.managedQuery(ContactsContract.Data.CONTENT_URI, cols, filter, params, null);
while (website.moveToNext())
String val = website.getString(website.getColumnIndex(ContactsContract.CommonDataKinds.Website.URL));
if (!StringUtils.isEmpty(val))
return val;
return null;
// abb2yb: 现在的启蒙
【讨论】:
以上是关于ContactsContract.CommonDataKinds.StructuredName 的问题的主要内容,如果未能解决你的问题,请参考以下文章