Android:根据电话号码搜索联系人

Posted

技术标签:

【中文标题】Android:根据电话号码搜索联系人【英文标题】:Android: Search Contact based on Phone Number 【发布时间】:2014-11-01 12:54:40 【问题描述】:

我必须根据电话号码搜索联系人。这是用于获取联系人的代码。我使用的 android API 级别是 15

        String[] projection = new String[] 
                ContactsContract.CommonDataKinds.Phone._ID,
                ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
                ContactsContract.CommonDataKinds.Phone.TYPE,
                ContactsContract.CommonDataKinds.Phone.NUMBER;

        Cursor query = mContent.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, projection,
                    ContactsContract.CommonDataKinds.Phone.NUMBER + " LIKE '%" + constraint.toString() + "%'"
                    ,null, ContactsContract.Contacts.DISPLAY_NAME + " COLLATE LOCALIZED ASC");

我能够获取联系人表中保存的电话号码中没有空格的联系人。如果电话号码之间有空格,则上述查询失败。例如,对于一个联系人,如果电话号码保存为 1234567890,并且当我使用值 1234 进行搜索时,将检索到此联系人。但如果联系人保存为“123 456 7890”则失败。

底线,当我尝试使用电话号码搜索具有或包含“1234”的联系人时,结果应该返回给我电话号码为“1234567890”和“123 4567 890”的联系人。因为有些安卓手机会用空格保存电话号码。

我该如何解决这个问题。任何帮助表示赞赏。

【问题讨论】:

constraint 的每个字符之间添加% 是一种选择 长话短说,要通过电话号码搜索,您需要使用ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER,其中包含E.164格式的电话号码。 developer.android.com/reference/android/provider/… @SarwarErfan 对不起,我不能使用这个常量,我所在的 API 级别是 15。ContactsContract.CommonDataKinds.Phone.NORMALIZED_NUMBER 是在 API 16 中添加的。 对于较旧的 api,请检查:***.com/questions/4579009/… 你能找到解决办法吗? 【参考方案1】:

试试这个:

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

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

    try 
        if (contact != null && contact.getCount() > 0) 
            contact.moveToNext();
            name = contact.getString(contactLookup.getColumnIndex(ContactsContract.Data.DISPLAY_NAME));
        
     finally 
        if (contact != null) 
            contact.close();
        
    

    return name;

【讨论】:

当我尝试使用“1234”进行搜索时,这是否会返回一个电话号码为“123 456 7890”的联系人?我想,当我们输入完整的电话号码时,这会起作用。 是的,只要输入完整的电话号码就可以了。 这是***.com/questions/3712112/… 的完整副本,没有参考。干得好!【参考方案2】:

在你的代码中改变

constraint.toString() 而不是写成 constain.replaceAll(" ", "");

从字符串中删除所有空格

【讨论】:

为了清楚起见,我正在尝试搜索以“1234”开头的联系人,结果应该返回给我电话号码“1234567890”和“123 4567 890”的联系人。一些 Android 设备可以节省空间。如何检索两者。?【参考方案3】:

试试这个:

String whereName = ContactsContract.Data.MIMETYPE + " = ?";
String number;
String[] whereNameParams = new String[]  ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE ;
Cursor nameCur = con.query(ContactsContract.Data.CONTENT_URI, null, whereName, whereNameParams, ContactsContract.CommonDataKinds.Phone.NUMBER);


while (nameCur.moveToNext()) 
    number = nameCur.getString(nameCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));

    if (number != null) 
        if (number.contains(num)) 
            System.out.println(number);

        
    


nameCur.close();

在回答的评论中说: “我正在尝试搜索以“1234”开头的联系人,结果应该返回给我电话号码“1234567890”和“123 4567 890”的联系人。”

我的代码解决了这个问题。

【讨论】:

您好,请在您的回答中添加一些解释 你宁愿解释为什么你的代码会解决 op 问题。

以上是关于Android:根据电话号码搜索联系人的主要内容,如果未能解决你的问题,请参考以下文章

Android - 在联系人列表中搜索特定电话号码

如何根据电话号码查询 Android 联系人?

搜索联系人并从android中的电话联系人中获取联系人号码

如何从android中的联系人中搜索号码?

android 车机电话的通讯录联系人搜索实现解析 ------- 填坑日记

android 车机电话的通讯录联系人搜索实现解析 ------- 填坑日记