Android联系人--联系人查询2

1 首先我们要明白,在2.0后,联系人数据库大改了,导致之前的查询可能失效,深入了解请参考点击打开链接

2 我们在查询联系人一般都是 ContactsContract.Contacts.CONTENT_URI(2.0后谷歌建议的类),可是在此类只可以查询到姓名,并不能查询到手机号码,如果需要需要手机号码(绝大多数情况下都需要查询),这个时候我们就需要在循环内查询Phone表,这样循环里面嵌套循环,循环的开关游标,如果联系人少还好说, 如果多,就会变的非常卡卡,本人100+联系人,在2G内存S3下都很卡。所以我们要找个方法来解决他。

3 我们需要明白如下,系统是以姓名作为唯一标示,如果 系统存在 (习,10086,李 10000,王 10010,习 110) 这几个联系人。在系统通讯录下是3个,因为系统会自动合并

在QQ通讯录,360通讯录,百度通讯录都是3个,而且我们通过ContactsContract.Contacts.CONTENT_URI也是3个,

但是通过Phone查询是4个,通过RawContact查询的是4个,通过Phone和RawContact查询的是联系人的详细信息,是有电话号码的,但是通 过ContactsContract.Contacts.CONTENT_URI是没有电话号码的,所以我们为了提高效率,必须考虑是否查询Phone这个url

4 通过phone查询之后,联系人要比系统显示的多,且姓名相同的没有自动合并,这就需要我们收到处理了

5 关键在于add2List方法,以姓名为唯一标示,将联系人合并,这样只需要一个循环,效率大为提高,而且和QQ,360,系统一样的效果

6 本人的做法,开机启动一个服务,这个服务去查询联系人数据,然后放到application中,因为这个服务一直在后台运行,所以进入到联系人界面非常非常快(但是360和QQ电脑管家可以禁止我的开机启动,和服务被kill后不能再次重新启动,方法是我们可以比360更流氓,开个闹钟,不停发广播,监听各种广播事件........)

import android.provider.ContactsContract.CommonDataKinds.Phone;

/** * 查询联系人 */private void queryContact() {String[] projection = { Phone._ID, Phone.DISPLAY_NAME, Phone.DATA1,Phone.CONTACT_ID, "sort_key", Phone.PHOTO_ID }; // 查询的列asyncQuery.startQuery(0, null, Phone.CONTENT_URI, projection, null,null, "sort_key COLLATE LOCALIZED asc"); // 按照sort_key升序查询}


class MyAsyncQueryHandler extends AsyncQueryHandler {public MyAsyncQueryHandler(ContentResolver cr) {super(cr);}@Overrideprotected void onQueryComplete(int token, Object cookie, Cursor cursor) {switch (token) {case 0:// 查询联系人if (cursor != null && cursor.getCount() > 0) {list = new ArrayList<ContactBean>();while (cursor.moveToNext()) {ContactBean cb = new ContactBean();cb.contactId = cursor.getInt(0);cb.displayName = cursor.getString(1);String number = cursor.getString(2);if (number.contains("+86")) {cb.phoneNum = number.substring(3, number.length());} else {cb.phoneNum = number;}cb.contactId = cursor.getInt(3);cb.sortKey = cursor.getString(4);//if (null != cb.displayName) {// 将姓名转换为拼音,需要pinyin4j-2.5.0.jar//cb.pinyin = Tools.chineseToPinYin(cb.displayName);//}cb.photoId = cursor.getLong(5);cb.list.add(number);//add2List(list, cb);Log.e("MainActivity", cb.toString());}//setContactAdapter(list);}break;}}}

/**     * 以姓名为唯一标示,将姓名相同的号码联系人合并     *      * @param list     * @param ContactBean     */    public void add2List(ArrayList<ContactBean> list, ContactBean cb) {        int size = list.size();        for (int i = 0; i < size; i++) {            if (list.get(i).displayName.equals(cb.displayName)) {                int length = cb.list.size();                for (int j = 0; j < length; j++) {                    list.get(i).list.add(cb.list.get(j));                }                return;            }        }        list.add(cb);    }

public class ContactBean {public int contactId;// 联系人IDpublic int selected;public String displayName;// 姓名public String phoneNum;// 显示的电话号码public String sortKey;// sortKeypublic Long photoId;// 头像IDpublic String lookUpKey;// lookUpKeypublic String pinyin;// 姓名的中文拼音public ArrayList<String> list;// 存储姓名的集合public ContactBean() {list = new ArrayList<String>();}public ContactBean(int contactId, int selected, String displayName,String phoneNum, String sortKey, Long photoId, String lookUpKey,String pinyin, ArrayList<String> list) {super();this.contactId = contactId;this.selected = selected;this.displayName = displayName;this.phoneNum = phoneNum;this.sortKey = sortKey;this.photoId = photoId;this.lookUpKey = lookUpKey;this.pinyin = pinyin;this.list = list;}@Overridepublic String toString() {return "ContactBean [contactId=" + contactId + ", selected=" + selected+ ", displayName=" + displayName + ", phoneNum=" + phoneNum+ ", sortKey=" + sortKey + ", photoId=" + photoId+ ", lookUpKey=" + lookUpKey + ", pinyin=" + pinyin + ", list="+ list + "]";}}




更多相关文章

  1. Nginx系列教程(六)| 手把手教你搭建 LNMP 架构并部署天空网络电影
  2. Android(安卓)4.4系统适配AlertDialog,半透明出现白色背景怎么去
  3. 安卓系统上的远程 JS 调试 Remote JavaScript Debugging on Andr
  4. Android(安卓)系统C++智能指针----总结
  5. Android使用系统文件管理器选择文件,并将Uri转换为File
  6. 谷歌加强Android监管,你的安卓机用起来会更持久
  7. Android驱动之 Linux Input子系统之TP——A/B(Slot)协议
  8. [置顶] Android(安卓)进程常驻(5)----开机广播的简单守护以及总结
  9. android 联系人快速搜索

随机推荐

  1. 时代变了,这才是敏捷DevOps、低代码、微服
  2. 英特尔进击新能源发电,看AI如何用气象预报
  3. 在推荐系统中,我还有隐私吗?联邦学习:你可以
  4. CCKS 2020「基于标题的大规模商品实体检
  5. 10万字节跳动员工都在用的办公协同软件,如
  6. 让AI像Excel一样普及:这周末,我们聊了聊AI
  7. 如何从 0 到 1 构建埋点体系
  8. 微信小程序服务类目在哪里可以修改?
  9. 机器人是怎么知道如何抓握杯子的?
  10. MongoDB副本集配置hidden从库