按电话号码搜索联系人

问题描述:

在我的应用程序中,用户写了一个电话号码,我想用该电话号码找到联系人姓名?按电话号码搜索联系人

我通常寻找这样的接触:

Cursor cur = getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, 
      null, null, null, null); 

但我这样做是为了访问所有联系人......在这个程序,我只希望得到给定电话号码的联系人姓名...如何我可以限制查询吗?

或者我必须去掉所有的联系人,看看是否有给定的电话号码?但我认为,这可能会很慢这样...

+0

阅读有关所有这些空白可与:) – 2010-09-14 20:16:29

+0

也将被替换的文件,要使用'CONTENT_FILTER_URI'。 – 2010-09-14 20:17:02

+0

对于其他人的设施,我写了一篇文章,其中包含整个代码,用于查询姓名,照片,联系人ID等,并提供正确的解释。该代码包含在不同答案中发现的片段,但更多地组织和测试。希望能帮助到你。链接:http://hellafun.weebly.com/home/get-information-of-a-contact-from-number – Usman 2017-05-02 15:12:28

你应该看看推荐ContactsContract.PhoneLookup提供商

表示仰视的电话号码,例如呼叫者ID结果的表。要执行查找,您必须在CONTENT_FILTER_URI中追加想要查找的号码。这个查询是高度优化的。

Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(phoneNumber)); 
resolver.query(uri, new String[]{PhoneLookup.DISPLAY_NAME,... 
+0

谢谢。我试图调用getContentResolver()在我的广播接收器,但它看起来像那个函数不存在... – 2010-09-14 20:56:05

+3

尝试前缀的上下文参数,因此它是context.getContentResolver() – Pentium10 2010-09-15 08:25:22

+3

什么具体进入剩下的查询?这个答案不比现有的文档更有帮助。 – eternalmatt 2011-03-19 21:24:48

如果你想的完整代码:

public String getContactDisplayNameByNumber(String number) { 
    Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number)); 
    String name = "?"; 

    ContentResolver contentResolver = getContentResolver(); 
    Cursor contactLookup = contentResolver.query(uri, new String[] {BaseColumns._ID, 
      ContactsContract.PhoneLookup.DISPLAY_NAME }, null, null, null); 

    try { 
     if (contactLookup != null && contactLookup.getCount() > 0) { 
      contactLookup.moveToNext(); 
      name = contactLookup.getString(contactLookup.getColumnIndex(ContactsContract.Data.DISPLAY_NAME)); 
      //String contactId = contactLookup.getString(contactLookup.getColumnIndex(BaseColumns._ID)); 
     } 
    } finally { 
     if (contactLookup != null) { 
      contactLookup.close(); 
     } 
    } 

    return name; 
} 
+0

谢谢!我不会初始化'name'变量,因为当没有记录时'null'是一个合适的返回值。 – 2014-04-15 17:33:01

+4

特殊情况下,用户输入部分号码,但以不匹配的格式存储号码?例如,在以色列,国家的前缀是“+972”,对于某些手机号码,则添加“050”,但如果是全部号码,则变为“97250”(没有第一个“0”)。因此,如果用户键入“050”(搜索所有电话号码或至少以它开头),它将不会得到任何结果... – 2015-01-04 10:19:29

+0

在我的情况下,我实现了一个函数来过滤一个原始数字并做出所有可能的组合,然后我逐一搜索。不幸的是,我认为Android没有办法简化它。我错了吗? – 2015-01-05 17:43:01