玩爆你的手机联系人

自己研究了好几天联系人的T9搜索算法, 先分享出来给大家看看. 欢迎指教.如果有大神有更好的T9搜索算法, 那更好啊,大家一起研究研究,谢谢.

第一部分是比较简单的获取手机联系人.

获取联系人前提要有权限.

<uses-permission android:name="android.permission.READ_CONTACTS" />

因为手机的联系人都存储在数据库里面,所以我们只要把数据库里的信息查询出来即可.

private static final String[] PHONES_PROJECTION = new String[] {Phone.DISPLAY_NAME, Phone.NUMBER, Photo.SORT_KEY_ALTERNATIVE};

ContentResolver resolver = getBaseContext().getContentResolver();Cursor phoneCursor = resolver.query(Phone.CONTENT_URI,PHONES_PROJECTION, null, null, null);

这里我只是简单的说一下而已,后面的遍历phoneCursor 就能把联系人查询出来.(我项目里是开一条线程获取联系人的,以防太多联系人导致页面空白或者卡顿)

第二部分是T9搜索部分

思路是: a只要联系人的号码有包含我输入的数字就add到list进去,

b联系人的姓名拼音有包含我输入的拼音就add到list进去,

c联系人的姓名缩写拼音有包含我输入的拼音就add到list进去

举个例子–联系人姓名:测试,号码:1234567890

情况一:我输入1234567890就能把测试显示出来

情况二:我输入23744(ceshi),因为这个"测试"的拼音,所以也能把测试显示出来

情况三:我输入(27)cs,这是"测试"的拼音缩写,所以也能把测试显示出来

当然我输入23(ce)或者744(shi)什么的,都可以把测试显示出来.

个人是把联系人的号码(1234567890),姓名拼音转成数字(ceshi对应是23744),拼音缩写拼音转成数字(cs对应27),这些信息存储到list里面.便于遍历跟比较.

然后再结合代码讲解一下:

我的流程是这样的:

首先开始发送一条线程去获取联系人

/** * 刚开始启动程序时,开条线程去获取联系人 */new Thread(getContract).start();这线程里面获取到的联系人存储到mLIst里面;

其中在获取的时候处理了一下,把联系人姓名,号码,拼音,拼音缩写查出来后放到bean里面;

private static final String[] PHONES_PROJECTION = new String[] {Phone.DISPLAY_NAME, Phone.NUMBER, Photo.SORT_KEY_ALTERNATIVE};

这个是查出联系人的姓名,号码,姓名拼音:测试,1234567890,CE 测 SHI 试

(对Contacts了解就会知道(不了解可以了解下),每个联系人都有一个sort_key字段,如果查询中没有设置sortOrder,默认就会以 sort_key字段为排序依据.名字的检索其实也是根据sort_key来做的(比如拨号盘的模糊匹配:数字转成字母,再到拼音,,最后得到汉字).sort_key是根据名字生成的:如果联系人名字中包含字母,sort_key和name保持一致;如果名字是汉字,生成的sort_key,"拼音 汉字-拼音 汉字".其中拼音全大写,中间以空格分割,如:"测试"对应的sort_key:"CE 测 SHI 试")

外语:格式就是以上那样,因为Google有提供一个汉字转拼音的类,然后把"CE 测 SHI 试"存储到数据库里.所以用这个就能查出来.但毕竟是外国人弄的,所以在拼音上有时候会有一些差池.例如咱们常见的"呵呵",咱们习惯是"HE 呵 HE 呵",但它可能会保存成"A 呵 A 呵".

/** * 将联系人的姓名拼音全部转化为数字 * @param 联系人姓名拼音 * @return 姓名拼音对应数字 */public String getNum(String search, boolean status){String str = "";for(int i = 0;i<search.length();i++){String c = search.charAt(i)+"";if(c.equals("1")){str = str + "1";if(status){i = i + 1;}continue;}else if(c.equals("A")||c.equals("B")||c.equals("C")||c.equals("2")||c.equals("a")||c.equals("b")||c.equals("c")){str = str + "2";if(status){i = i + 1;}continue;}else if(c.equals("D")||c.equals("E")||c.equals("F")||c.equals("3")||c.equals("d")||c.equals("e")||c.equals("f")){str = str + "3";if(status){i = i + 1;}continue;}else if(c.equals("G")||c.equals("H")||c.equals("I")||c.equals("4")||c.equals("g")||c.equals("h")||c.equals("i")){str = str + "4";if(status){i = i + 1;}continue;}else if(c.equals("J")||c.equals("K")||c.equals("L")||c.equals("5")||c.equals("j")||c.equals("k")||c.equals("l")){str = str + "5";if(status){i = i + 1;}continue;}else if(c.equals("M")||c.equals("N")||c.equals("O")||c.equals("6")||c.equals("m")||c.equals("n")||c.equals("o")){str = str + "6";if(status){i = i + 1;}continue;}else if(c.equals("P")||c.equals("Q")||c.equals("R")||c.equals("S")||c.equals("7")||c.equals("p")||c.equals("q")||c.equals("r")||c.equals("s")){str = str + "7";if(status){i = i + 1;}continue;}else if(c.equals("T")||c.equals("U")||c.equals("V")||c.equals("8")||c.equals("t")||c.equals("u")||c.equals("v")){str = str + "8";if(status){i = i + 1;}continue;}else if(c.equals("W")||c.equals("X")||c.equals("Y")||c.equals("Z")||c.equals("9")||c.equals("w")||c.equals("x")||c.equals("y")||c.equals("z")){str = str + "9";if(status){i = i + 1;}continue;}else if(c.equals("0")){str = str + "0";if(status){i = i + 1;}continue;}}return str;};这个方法主要是将拼音转换成数字,例如测试的"ce 测 shi 试"就能转成23744.大家估计还看到我还传了个参数boolean status,这个是用于判读是否为拼音字母缩写的,如果为true的话,他会查出测试的"ce 测 shi 试"的字母缩写,cs转成27.

获取到联系人,再显示出来之后,就是搜索了.

便觉不过如此。也许我们只是想让自己的心去旅行,

玩爆你的手机联系人

相关文章:

你感兴趣的文章:

标签云: