我想从地址簿中获取联系人的昵称。我从他的电话号码开始,查询它并希望得到昵称(也就是别名)。
Cursor cur = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.NUMBER + " = " + incomingNumber, null, null);
if (cur.moveToFirst()) {
Log.e("saymyname", cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Nickname.NAME)));
Log.e("saymyname", cur.getString(cur.getColumnIndex(ContactsContract.CommonDataKinds.Nickname.LABEL)));
}
日志的输出是incomingNumber(第一个Log.e())和null(第二个Log.e()),但我想得到联系人的昵称!
由于 汤姆
答案 0 :(得分:4)
昵称与电话号码不在同一个表格中,您必须查询ContactsContract.Data.CONTENT_URI
答案 1 :(得分:2)
answer from Pentium10非常有帮助!谢谢!
如果有人需要样品,请查看以下代码:
public String accessContact(String incomingNumber) {
if (incomingNumber == null || "".equals(incomingNumber)) {
return "unknown";
}
try {
Cursor cur = context.getContentResolver().query(Phone.CONTENT_URI, new String[] {Phone.DISPLAY_NAME, Phone.TYPE, Phone.CONTACT_ID}, Phone.NUMBER + " = " + incomingNumber, null, null);
int nameIndex = cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME);
int typeIndex = cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE);
int idIndex = cur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID);
String name;
String type;
String id;
if (cur.moveToFirst()) {
name = cur.getString(nameIndex);
type = cur.getString(typeIndex);
id = cur.getString(idIndex);
} else {
return "unknown";
}
cur = context.getContentResolver().query(ContactsContract.Data.CONTENT_URI, new String[] {ContactsContract.Data.DATA1}, ContactsContract.Data.CONTACT_ID + " = " + id, null, null);
int nicknameIndex = cur.getColumnIndex(ContactsContract.Data.DATA1);
String nickname;
if (cur.moveToFirst()) {
nickname = cur.getString(nicknameIndex);
if (nickname.equals(incomingNumber)) {
return name;
}
return nickname;
} else {
return name;
}
} catch (Exception e) {
e.printStackTrace();
return "unknown";
}
答案 2 :(得分:2)
(我没有必要的评论声誉所以我必须添加答案)
TomTasche's answer具有误导性,这让我浪费了大量时间试图找出为什么我无法在我认识的联系人上获得正确的昵称。
我自己找到了答案,但得到了this post的确认,我现在正在正确地做到这一点。
基本上,当您阅读了您阅读的ContactsContract.Data文档时:
数据表的每一行通常用于存储单件的联系信息(例如电话号码)及其相关元数据(例如是工作号码还是家庭号码)
这解释了TomTasche代码的阴暗部分:
if (nickname.equals(incomingNumber)) {
return name;
}
由于仅使用CONTACT_ID进行搜索可以返回多行(每种信息类型一行),因此无法保证第一行包含昵称。如果有昵称,它将在DATA1中,但在DATA1中也可以找到phone number。
ContactsContract.Data文档中的示例部分清楚地表明必须根据MIME_TYPE选择行,只有选择了MIME_TYPE时,我们才能开始理解行本身的内容。
因此,正确的查询将是:
cursor = getContentResolver().query(
ContactsContract.Data.CONTENT_URI,
new String[]{Nickname.NAME},
ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + "= ?",
new String[]{contactID, Nickname.CONTENT_ITEM_TYPE},
null);
(其中昵称为ContactsContract.CommonDataKinds.Nickname)
我觉得我必须就这个话题说些什么,以防止其他人浪费尽可能多的时间基于这个唯一的主题(我在谷歌朋友找到的第一个)。