如何从Android上的电话号码查找联系人姓名?

时间:2010-02-01 00:37:53

标签: android

我正在尝试使用内容提供商从联系人数据库中获取发件人的姓名。

问题是我不知道如何实现它。像现在一样,我只能从smsMessage中提取电话号码。我需要先检查一下正在呼叫的电话号码是否在用户联系人中,如果是,则显示该名称,然后显示该号码。

2 个答案:

答案 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)