几个星期前,我问了同样的问题here。起初,我认为答案解决了我的问题,但他们没有。我只是没有注意到我无法用这些答案来解决我的问题。
然而,我现在得到的是:
final Cursor phoneCursor = context.getContentResolver().query(Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode("'" + incomingNumber + "'")), null, null, null, null);
phoneCursor.moveToFirst();
String lookupString = phoneCursor.getString(phoneCursor.getColumnIndex(PhoneLookup.LOOKUP_KEY));
final Cursor dataCursor = context.getContentResolver().query(ContactsContract.Data.CONTENT_URI, null, ContactsContract.Data.LOOKUP_KEY + "=" + "'" + lookupString + "'", null, null);
dataCursor.moveToFirst();
Log.e("smn", "display_name: " + dataCursor.getString(dataCursor.getColumnIndex(ContactsContract.Data.DISPLAY_NAME)));
Log.e("smn", "nickname: " + dataCursor.getString(dataCursor.getColumnIndex(ContactsContract.Data.DATA1)));
输出如下:
08-14 17:41:02.106: ERROR/smn(20146): display_name: Tom Tasche
08-14 17:41:02.106: ERROR/smn(20146): nickname: null
This answer告诉我,昵称保存在数据表中,但是虽然我在查询数据表,但我没有检索保存在地址簿中的联系人别名。
我已经尝试过另一种方式:我为此联系人插入了一个新别名。这很好。所以,绰号似乎有效。 此外,我已经打印出保存在数据表中的每个字段,再次,没有运气。
有什么想法吗?也许我做的事情完全错了,但此刻我看不出有什么问题......
感谢您的帮助
汤姆
答案 0 :(得分:0)
我找到了“解决方法”:
Uri uri = Uri.withAppendedPath(Contacts.CONTENT_VCARD_URI, lookup);
InputStream stream = settings.context.getContentResolver().openInputStream(uri);
int length = stream.available();
if (length <= 0) {
return;
}
byte[] vcard = new byte[length];
int bytesRead = stream.read(vcard, 0, length);
if (bytesRead < length) {
return;
}
String vcardString = new String(vcard, 0, bytesRead, "UTF-8");
String SPLIT = "X-ANDROID-CUSTOM:vnd.android.cursor.item/nickname;";
if (vcardString.contains(SPLIT)) {
vcardString = vcardString.substring(vcardString.indexOf(SPLIT) + SPLIT.length());
vcardString = vcardString.substring(0, vcardString.indexOf(';'));
name = vcardString;
}
这真的很愚蠢,但它的工作原理并没有那么慢(~300毫秒)。
祝你好运汤姆