【问题标题】:How to look-up a contact's name from their phone number on Android?如何从 Android 上的电话号码中查找联系人的姓名?
【发布时间】:2011-01-11 13:20:53
【问题描述】:

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

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

【问题讨论】:

  • 您可以将这个问题概括为“如果给定原始的、未格式化的电话号码字符串,您如何查找联系人?”

标签: android


【解决方案1】:

是的,这可以在 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-5555555-555-5555 是否都匹配 555555555
  • 电话号码的格式重要吗?也就是说,(555) 555-5555 和 555-555-5555 是否都匹配 555555555? [2]
  • 数字的格式无关紧要。现在更新我的答案。
  • 电话号码中缺少国家代码是否会在查找中产生任何问题?我的意思是,如果存储的联系人包含国家代码作为前缀,并且我试图将其与没有国家代码的号码匹配,它会匹配吗?
【解决方案2】:

这就是我所做的

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)

【讨论】:

  • 这里有更多好的例子:stackoverflow.com/questions/3079365/…
  • 这对我帮助很大。谢谢安德鲁,只是一个小问题。是否有可能进一步更改此代码,并在您键入时使其搜索/匹配电话号码与联系人姓名?假设我的号码是 444 886 444。我碰巧记得“886”,而不是其余的。它应该搜索和匹配并“给”我一些结果。如果您愿意回答我的评论,将不胜感激。如果有人有这种东西的链接,请发布。提前致谢!
猜你喜欢
  • 1970-01-01
  • 2011-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-14
  • 1970-01-01
  • 2011-09-13
相关资源
最近更新 更多