Android通过电话号码有效地获取联系人姓名以在ListView中显示

Posted

技术标签:

【中文标题】Android通过电话号码有效地获取联系人姓名以在ListView中显示【英文标题】:Android get contact names by phone number efficiently for displaying in ListView 【发布时间】:2013-01-09 14:32:18 【问题描述】:

我正在创建一个短信应用,它在主活动中包含一个ListView,它显示来自短信收件箱的所有对话。每个ListView 行显示一个对话以及电话号码、消息正文和消息时间。现在我想显示联系人姓名而不是电话号码(如果存在)。

到目前为止,为了通过电话号码获取联系人姓名,我找到了这个代码

private String getDisplayNameByNumber(String number) 
    Uri uri = Uri.withAppendedPath(ContactsContract.PhoneLookup.CONTENT_FILTER_URI, Uri.encode(number));

    Cursor contactLookup = context.getContentResolver().query(uri, new String[] ContactsContract.PhoneLookup._ID,
                                            ContactsContract.PhoneLookup.DISPLAY_NAME , null, null, null);

    int indexName = contactLookup.getColumnIndex(ContactsContract.Data.DISPLAY_NAME);

    try 
        if (contactLookup != null && contactLookup.moveToNext()) 
            number = contactLookup.getString(indexName);
        
     finally 
        if (contactLookup != null) 
            contactLookup.close();
        
    

    return number;

但这似乎效率低下,因为它必须单独查询每个联系人姓名并且滞后于应用程序。因此,我尝试从手机中获取所有联系人姓名并将其存储在 HashMap 中,其中电话号码作为键,联系人姓名作为值,以便我可以随时从HashMap。但似乎还有一个问题,电话号码以多种不同的格式存储,例如:

+91 4324244434
04324244434
0224324244434

那么我如何从HashMap 中搜索电话号码,因为它可以以多种不同的格式存储?

【问题讨论】:

【参考方案1】:

在将联系人添加到HashMap 之前,请使用正则表达式来获取电话号码。这样,无论电话号码是什么格式,正则表达式都能抓取到所需的相应号码。

获取号码后,将其添加到HashMap

希望能回答你的问题。

【讨论】:

我认为电话号码可以以多种不同的格式存储,为此创建一个正则表达式可能很困难。您是否知道 android 库(问题中发布的代码)如何搜索电话号码并始终提供完全匹配? @Sam 对不起,我在那个部门帮不了你。尝试在developer.android.com/training/index.html 上查看 Google 的 Android 资源。此外,这也可能是一个相关问题:***.com/questions/3079365/…

以上是关于Android通过电话号码有效地获取联系人姓名以在ListView中显示的主要内容,如果未能解决你的问题,请参考以下文章

Onitem 单击功能以在 android 中联系应用程序

android获取联系人图片、姓名和手机号码

如何从android中的联系人姓名获取联系人的号码

Android获取手机联系人的姓名和电话

Android 联系人选择器获取姓名 + 号码 + 电子邮件

Android 获取联系人手机号码姓名地址公司邮箱生日