Android T9搜索联系人(智能拨号器)

Vik*_*lla 0 android contactscontract android-contacts

我想实现T9搜索,例如android native Dialer或TrueCaller Dialer。我到目前为止所取得的成就是:

将击键转换为字符串模式,例如,如果我在拨号程序上按2,它将给我-“ abc”“ ac”“ ca”等

现在我查询

字符串选择= Utility.getSelectionLikeWithIn(mmemonics);

游标查询= getContentResolver()。query(ContactsContract.Contacts.CONTENT_URI,null,selection,null,null);'

公共静态字符串getSelectionLikeWithIn(List mmemonics){

    String selection = "";
    for (int i = 0; i < mmemonics.size(); i++) {
        selection = selection + " display_name LIKE '";
        selection = selection + mmemonics.get(i);

        if (i == mmemonics.size() - 1){
            selection = selection + "%'";


        }else {
            selection = selection + "%' OR";
        }
    }
    return selection;
}'
Run Code Online (Sandbox Code Playgroud)

上面的方法将字符串的Arraylist转换为where子句

其中display_name喜欢'ab%'或display_name喜欢'abc%'等等……

好吧,这给了我效率低下的结果,并且由于复杂的查询而导致应用程序崩溃.....

请建议我如何执行查询以像我的击键一样进行匹配,或者以其他方式在ContactsProvider中进行匹配以执行此类智能搜索

mar*_*mor 5

如果您要刷新每个数字的列表,请按一下此技术,因为它会很慢,因此不起作用。

更好的选择是从数据库中读取所有联系人姓名Contacts,并将其存储在简单ArrayList<String>或类似的集合中,最好在读取姓名时将其转换toLowerCase()为便于下一步搜索的联系人。

接下来,对于每个按下的数字,从输入的数字构建一个正则表达式模式,例如“ 234”将转换为该模式.*[abc][def][ghi].*

构建模式后,遍历名称列表并返回与模式匹配的名称。