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

ron*_*173 16 android

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

问题是我不知道如何实现它.像现在一样,我只能从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.有关更多详细信息,请在代码库中搜索此方法.顺便说一下,我不确定在你自己的应用程序中直接使用该功能是否安全,但我不会.

  • 电话号码的格式是否重要?也就是说,`(555)555-5555`和`555-555-5555`都匹配`555555555`? (4认同)
  • 在电话号码中是否缺少国家/地区代码会在查找中产生任何问题?我的意思是,如果存储的联系人包含国家/地区代码作为前缀,并且我尝试将其与没有国家/地区代码的号码匹配,那么它是否与之匹配? (3认同)
  • 具体涉及该查询的其余部分?这个答案比现有文档更有帮助. (2认同)

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)