我正在尝试使用内容提供商从联系人数据库中获取发件人的姓名。
问题是我不知道如何实现它。像现在一样,我只能从smsMessage中提取电话号码。我需要先检查一下正在呼叫的电话号码是否在用户联系人中,如果是,则显示该名称,然后显示该号码。
答案 0 :(得分:24)
是的,这可以使用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。顺便说一句,我不确定在你自己的应用程序中直接使用该功能是否安全,但我不会。
答案 1 :(得分:19)
这就是我做的事情
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)