如何在Android中使用部分电话号码搜索联系人

时间:2018-09-06 13:39:55

标签: android android-contentprovider android-contacts android-cursorloader

我正在尝试使用下面的代码用部分电话号码对我的android应用程序中的联系人进行模糊搜索。但是我的搜索功能总是以无结果而告终。

例如

我已经联系了电话号码1234567890,名称为“ example”。

fuzzySearch("4567");应该返回并带有名为“ example”的联系人。

有人可以指出我哪里错了吗?我已经检查过here。但是以运行时SQL查询错误结束。

public ArrayList<Contact> fuzzySearch(String match) {
    private static final String SELECTION = Phone.NUMBER + " LIKE ? COLLATE NOCASE";

    Uri uri = Uri.withAppendedPath(ContactsContract.CommonDataKinds.Phone.CONTENT_FILTER_URI, Uri.encode(match));

    String[] projectionFields = new String[]{ContactsContract.Contacts._ID, Phone.NUMBER};

    CursorLoader cursorLoader = null;

    ArrayList<Contact> listContacts = new ArrayList<>();

    if(match.trim().length() == 0){
       return listContacts;
    }else {
        cursorLoader = new CursorLoader(context, uri, projectionFields, SELECTION, new String[]{"%"+match+"%"}, Phone.NUMBER);
    }

    Cursor c = cursorLoader.loadInBackground();

    final Map<String, Contact> contactsMap = new HashMap<>(c.getCount());

    if (c.moveToFirst()) {
        int idIndex = c.getColumnIndex(ContactsContract.Contacts._ID);
        int nameIndex = c.getColumnIndex(Phone.NUMBER);

        do {
            String contactId = c.getString(idIndex);
            String contactDisplayName = c.getString(nameIndex);
            Contact contact = new Contact(contactId, contactDisplayName);
            contactsMap.put(contactId, contact);
            listContacts.add(contact);
        } while (c.moveToNext());
    }

    c.close();
    return listContacts;
}

1 个答案:

答案 0 :(得分:0)

使用PhoneLookup代替手机。 因为您已经将搜索键编码到URL中,所以不需要选择,将其删除。

   Uri uri = Uri.withAppendedPath(PhoneLookup.CONTENT_FILTER_URI, Uri.encode(match));
   Cursor cur = resolver.query(uri, new String[]{PhoneLookup.DISPLAY_NAME,PhoneLookup.NUMBER, PhoneLookup.CONTACT_ID}, null, null, null);