我试图使用内容提供商从联系人数据库中获取发件人的姓名.
问题是我不知道如何实现它.像现在一样,我只能从smsMessage中提取电话号码.我需要先查看正在呼叫的电话号码是否在用户联系人中,如果是,则显示名称,如果不是,则显示该号码.
Rom*_*rik 25
是的,这可以ContactsContract.PhoneLookup.CONTENT_FILTER_URI在Android 2.0及更高版本以及Contacts.Phones.CONTENT_FILTER_URLAndroid 1.6及更早版本中使用.
有关示例用法,请参阅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, ...
Run Code Online (Sandbox Code Playgroud)
更新:电话号码的格式无关紧要.比较稳健且在Android上进行了高度优化; 它是使用名为的本机sqlite函数完成的PHONE_NUMBERS_EQUAL.有关更多详细信息,请在代码库中搜索此方法.顺便说一下,我不确定在你自己的应用程序中直接使用该功能是否安全,但我不会.
And*_*rew 20
这就是我做的
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();
}
Run Code Online (Sandbox Code Playgroud)
将您已有的电话号码传入Uri.encode(phoneNumber)