【发布时间】:2011-01-11 13:20:53
【问题描述】:
我正在尝试使用内容提供者从联系人数据库中获取发件人的姓名。
问题是我不知道如何实现它。就像现在我只能从 smsMessage 中提取电话号码。我需要先检查正在呼叫的电话号码是否在用户联系人中,如果不是则显示姓名。
【问题讨论】:
-
您可以将这个问题概括为“如果给定原始的、未格式化的电话号码字符串,您如何查找联系人?”
标签: android
我正在尝试使用内容提供者从联系人数据库中获取发件人的姓名。
问题是我不知道如何实现它。就像现在我只能从 smsMessage 中提取电话号码。我需要先检查正在呼叫的电话号码是否在用户联系人中,如果不是则显示姓名。
【问题讨论】:
标签: android
是的,这可以在 Android 2.0 及更高版本中使用 ContactsContract.PhoneLookup.CONTENT_FILTER_URI 和在 Android 1.6 及更早版本中使用 Contacts.Phones.CONTENT_FILTER_URL。
例如用法,请参阅ContactsContract.PhoneLookup 的文档。摘录如下:
// Android 1.6 and earlier (backwards compatible for Android 2.0+)
Uri uri = Uri.withAppendedPath(Contacts.Phones.CONTENT_FILTER_URL, Uri.encode(phoneNumber));
// Android 2.0 and later
Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber));
// Query the filter URI
String[] projection = new String[]{ PhoneLookup.DISPLAY_NAME, ...
Cursor cursor = context.getContentResolver().query(uri, projection, ...
更新:电话号码的格式无关紧要。在 Android 上比较健壮且高度优化;它是使用名为PHONE_NUMBERS_EQUAL 的本机 sqlite 函数完成的。更多详情,search the codebase for this method。顺便说一句,我不确定直接在您自己的应用中使用该功能是否安全,但我不会。
【讨论】:
(555) 555-5555 和 555-555-5555 是否都匹配 555555555?
这就是我所做的
ContentResolver localContentResolver = this.mContext.getContentResolver();
Cursor contactLookupCursor =
localContentResolver.query(
Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI,
Uri.encode(phoneNumber)),
new String[] {PhoneLookup.DISPLAY_NAME, PhoneLookup._ID},
null,
null,
null);
try {
while(contactLookupCursor.moveToNext()){
String contactName = contactLookupCursor.getString(contactLookupCursor.getColumnIndexOrThrow(PhoneLookup.DISPLAY_NAME));
String contactId = contactLookupCursor.getString(contactLookupCursor.getColumnIndexOrThrow(PhoneLookup._ID));
Log.d(LOGTAG, "contactMatch name: " + contactName);
Log.d(LOGTAG, "contactMatch id: " + contactId);
}
} finally {
contactLookupCursor.close();
}
将您已有的电话号码传入 Uri.encode(phoneNumber)
【讨论】: