`
zhonglunshun
  • 浏览: 141348 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

简单的AsyncQueryHandler获取手机联系人

阅读更多

利用AsyncQueryHandler能异步任务获取手机联系人,增加用户体验,使用起来也很方便。不多说,上干货。

布局文件main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical"
    tools:ignore="HardcodedText" >
    <Button
        android:id="@+id/bt_getCantacts"
        android:layout_width="fill_parent"
        android:layout_height="wrap_content"
        android:text="获取联系人信息" />
</LinearLayout>

 contact.java 联系人bean文件

package com.larson.cantact;
public class Contact {
    private int contactId;//联系人ID
    private String displayName;//联系人姓名
    private String phoneNum;//联系人手机号
    private String sortKey;//排序Key
    private Long photoId;//头像ID
    private String lookUpKey;
    private int selected = 0;//被选中的行号
    private String formattedNumber;//被格式化的号码
    private String pinyin;//姓名对应的汉语拼音
                                                                                                                                                                                         
    public int getContactId() {
        return contactId;
    }
    public void setContactId(int contactId) {
        this.contactId = contactId;
    }
    public String getDisplayName() {
        return displayName;
    }
    public void setDisplayName(String displayName) {
        this.displayName = displayName;
    }
    public String getPhoneNum() {
        return phoneNum;
    }
    public void setPhoneNum(String phoneNum) {
        this.phoneNum = phoneNum;
    }
    public String getSortKey() {
        return sortKey;
    }
    public void setSortKey(String sortKey) {
        this.sortKey = sortKey;
    }
    public Long getPhotoId() {
        return photoId;
    }
    public void setPhotoId(Long photoId) {
        this.photoId = photoId;
    }
    public String getLookUpKey() {
        return lookUpKey;
    }
    public void setLookUpKey(String lookUpKey) {
        this.lookUpKey = lookUpKey;
    }
    public int getSelected() {
        return selected;
    }
    public void setSelected(int selected) {
        this.selected = selected;
    }
    public String getFormattedNumber() {
        return formattedNumber;
    }
    public void setFormattedNumber(String formattedNumber) {
        this.formattedNumber = formattedNumber;
    }
    public String getPinyin() {
        return pinyin;
    }
    public void setPinyin(String pinyin) {
        this.pinyin = pinyin;
    }
}

 MainActivity.java

package com.larson.cantact;
import java.util.ArrayList;
import android.app.Activity;
import android.content.AsyncQueryHandler;
import android.content.ContentResolver;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
import android.provider.ContactsContract;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
public class MainActivity extends Activity {
    private Button myCantacts;
    private AsyncQueryHandler asyncQuery;
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        myCantacts = (Button) this.findViewById(R.id.bt_getCantacts);
        myCantacts.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {
                asyncQuery = new MyAsyncQueryHandler(getContentResolver());
                initSQL();
            }
        });
    }
    protected void initSQL() {
        // 联系人URI
        Uri uri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
        // 联系人ID,联系人NAME,
        String[] projection = { ContactsContract.CommonDataKinds.Phone._ID,
                ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
                ContactsContract.CommonDataKinds.Phone.DATA1, "sort_key",
                ContactsContract.CommonDataKinds.Phone.CONTACT_ID, };
        asyncQuery.startQuery(0, null, uri, projection, null, null,
                "sort_key COLLATE LOCALIZED asc");
    }
    private class MyAsyncQueryHandler extends AsyncQueryHandler {
        public MyAsyncQueryHandler(ContentResolver cr) {
            super(cr);
        }
        protected void onQueryComplete(int token, Object cookie, Cursor cursor) {
            querying(cursor);
        }
    }
    private void querying(final Cursor cursor) {
        Handler handlerInsertOrder = new Handler() {
            public void handleMessage(Message msg) {
                switch (msg.what) {
                case MyAsyncTask.DOWNLOADING_START_MESSAGE:
                    System.out.println("begin to sort out t9");
                    break;
                case MyAsyncTask.DOWNLOAD_END_MESSAGE:
                    Bundle bundle1 = msg.getData();
                    ArrayList<ContactBean> list = (ArrayList<ContactBean>) bundle1
                            .get("完成");
                    for (ContactBean ci : list) {
                        System.out.println(ci.getDisplayName());
                        System.out.println(ci.getPhoneNum());
                        System.out.println("--------------------------------");
                    }
                    break;
                default:
                    break;
                }
                super.handleMessage(msg);
            }
        };
        MyAsyncTask.startRequestServerData(this, handlerInsertOrder, cursor);
    }
}

 自定义的MyAsyncTask.java

package com.anjoyo.cantact;
import java.util.ArrayList;
import android.content.Context;
import android.database.Cursor;
import android.os.AsyncTask;
import android.os.Bundle;
import android.os.Handler;
import android.os.Message;
public class MyAsyncTask extends
        AsyncTask<Cursor, Void, ArrayList<ContactBean>> {
    /** 开始整理 */
    public static final int DOWNLOADING_START_MESSAGE = 7;
    /** 整理结束 */
    public static final int DOWNLOAD_END_MESSAGE = 17;
    private Context mContext = null;
    private Handler mHandler = null;
    protected MyAsyncTask(Context context, Handler handler) {
        this.mContext = context;
        this.mHandler = handler;
    }
    @Override
    protected void onPreExecute() {
        sendStartMessage(DOWNLOADING_START_MESSAGE);
    }
    @Override
    protected ArrayList<ContactBean> doInCursor...  params) {
        // 只需要把原来放在子线程的代码放到这个方法就行
        Cursor cursor = params[0];
        ArrayList<ContactBean> ciList = new ArrayList<ContactBean>();
        if (cursor != null && cursor.getCount() > 0) {
            try {
                cursor.moveToFirst();
                for (int i = 0; i < cursor.getCount(); i++) {
                    cursor.moveToPosition(i);
                    String name = cursor.getString(1);
                    String number = cursor.getString(2);
                    int contactId = cursor.getInt(4);
                    ContactBean contactInfo = new ContactBean();
                    contactInfo.setContactId(contactId);
                    contactInfo.setPhoneNum(number);
                    contactInfo.setDisplayName(name);
                    if (contactInfo.getDisplayName() == null) {
                        contactInfo.setDisplayName(contactInfo.getPhoneNum());
                    }
                                                                                        
                    ciList.add(contactInfo);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return ciList;
    }
    @Override
    protected void onPostExecute(ArrayList<ContactBean> result) {
        sendEndMessage(DOWNLOAD_END_MESSAGE, result);
    }
    public static void startRequestServerData(Context context, Handler handler,
            Cursor cursor) {
        new MyAsyncTask(context, handler).execute(cursor);
    }
    /**
     * 发送开始整理消息
     *
     * @param messageWhat
     */
    private void sendStartMessage(int messageWhat) {
        Message message = new Message();
        message.what = messageWhat;
        if (mHandler != null) {
            mHandler.sendMessage(message);
        }
    }
    /**
     * 发送整理结束消息
     *
     * @param messageWhat
     */
    private void sendEndMessage(int messageWhat, ArrayList<ContactBean> result) {
        Message message = new Message();
        message.what = messageWhat;
        Bundle bundle = new Bundle();
        bundle.putSerializable("完成", result);
        message.setData(bundle);
        if (mHandler != null) {
            mHandler.sendMessage(message);
        }
    }
}

 小工具,供人参考,方便广大程序员,欢迎指正。

分享到:
评论

相关推荐

    AsyncQueryHandler 手机联系人信息读取

    在Android开发中,获取手机联系人信息是一项常见的需求。`AsyncQueryHandler` 是Android系统提供的一种异步处理数据库查询的方法,特别适用于从SQLite数据库中读取大量数据,如手机联系人列表。本篇文章将深入探讨...

    Android使用AsyncQueryHandler实现获取手机联系人功能

    本文将详细介绍如何使用`AsyncQueryHandler`实现获取手机联系人的功能。 首先,我们来看一下布局文件`main.xml`。这是一个简单的线性布局,包含一个按钮`bt_getContacts`,用户点击这个按钮时,程序将启动获取联系...

    黑马程序员 安卓学院 万元哥项目经理 分享220个代码实例

    |--内容提供者之联系人读写与批量操作 |--内容提供者之获取通话记录 |--内容提供者的定义 |--写入联系人信息 |--利用FinalHttp实现多线程断点续传 |--加密之MD5 |--动画Animation详解 |--动画之view左右抖动 |--动画...

    基于Android的短信高效管理的研究.pdf

    作者提出利用AsyncQueryHandler异步查询辅助类来获取短信会话列表,避免因长时间阻塞主线程导致的ANR(Application Not Responding)异常。这种异步处理方式可以提高系统的响应速度和用户体验。 在短信显示方面,...

    GUI面板MATLAB香烟汉字识别.zip

    GUI面板MATLAB香烟汉字识别

    2023年统招专升本计算机考试真题及答案6.pdf

    2023年统招专升本计算机考试真题及答案6.pdf

    Java毕业设计-SpringBoot+Vue的“漫画之家”系统(附源码、数据库、教程).zip

    Java 项目, Java 毕业设计,Java 课程设计,基于 SpringBoot 开发的,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行! 1. 技术组成 前端:html、javascript、Vue 后台框架:SpringBoot 开发环境:idea 数据库:MySql(建议用 5.7 版本,8.0 有时候会有坑) 数据库工具:navicat 部署环境:Tomcat(建议用 7.x 或者 8.x 版本), maven 2. 部署 如果部署有疑问的话,可以找我咨询 Java工具包下载地址: https://pan.quark.cn/s/eb24351ebac4 后台路径地址:localhost:8080/项目名称/admin/dist/index.html 前台路径地址:localhost:8080/项目名称/front/index.html (无前台不需要输入)

    基于ssm+vue的教学视频点播系统(java毕业设计,包括源码,数据库,教程).zip

    Java 项目, Java 毕业设计,Java 课程设计,基于 SSM 开发的,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行! 1. 技术组成 前端:vue/html5 后台框架:SSM 开发环境:idea 数据库:MySql(建议用 5.7 版本,8.0 有时候会有坑) 数据库工具:navicat 部署环境:Tomcat(建议用 7.x 或者 8.x 版本), maven 2. 部署 如果部署有疑问的话,可以找我咨询 Java工具包下载地址: https://pan.quark.cn/s/eb24351ebac4

    Java毕业设计-基于SpringBoot+Vue+MySql的五台山景点购票系统(附源码、数据库、教程).zip

    Java 项目, Java 毕业设计,Java 课程设计,基于 SpringBoot 开发的,含有代码注释,新手也可看懂。毕业设计、期末大作业、课程设计、高分必看,下载下来,简单部署,就可以使用。 包含:项目源码、数据库脚本、软件工具等,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行! 1. 技术组成 前端:html、javascript、Vue 后台框架:SpringBoot 开发环境:idea 数据库:MySql(建议用 5.7 版本,8.0 有时候会有坑) 数据库工具:navicat 部署环境:Tomcat(建议用 7.x 或者 8.x 版本), maven 2. 部署 如果部署有疑问的话,可以找我咨询 Java工具包下载地址: https://pan.quark.cn/s/eb24351ebac4 后台路径地址:localhost:8080/项目名称/admin/dist/index.html 前台路径地址:localhost:8080/项目名称/front/index.html (无前台不需要输入)

    MATLAB设计的危险区域预警系统(GUI界面设计).zip

    MATLAB设计的危险区域预警系统(GUI界面设计)

    2023年江苏省计算机二级VB试卷.pdf

    2023年江苏省计算机二级VB试卷.pdf

    NSCBx1.0.1b Keys19.0.0.zip

    NSCBx1.0.1b Keys19.0.0.zip

    智慧园区一卡通与清分结算系统Word(45页).docx

    智慧园区,作为现代化城市发展的新兴模式,正逐步改变着传统园区的运营与管理方式。它并非简单的信息化升级,而是跨越了行业壁垒,实现了数据共享与业务协同的复杂运行系统。在智慧园区的构建中,人们常常陷入一些误区,如认为智慧园区可以速成、与本部门无关或等同于传统信息化。然而,智慧园区的建设需要长期规划与多方参与,它不仅关乎技术层面的革新,更涉及到管理理念的转变。通过打破信息孤岛,智慧园区实现了各系统间的无缝对接,为园区的科学决策提供了有力支持。 智慧园区的核心价值在于其提供的全方位服务与管理能力。从基础设施的智能化改造,如全面光纤接入、4G/5G网络覆盖、Wi-Fi网络及物联网技术的运用,到园区综合管理平台的建设,智慧园区打造了一个高效、便捷、安全的运营环境。在这个平台上,园区管理方可以实时掌握运营动态,包括道路状况、游客数量、设施状态及自然环境等信息,从而实现事件的提前预警与自动调配。同时,智慧园区还为园区企业提供了丰富的服务,如项目申报、资质认定、入园车辆管理及统计分析等,极大地提升了企业的运营效率。此外,智慧园区还注重用户体验,通过信息发布系统、服务门户系统及各类智慧应用,如掌上营销、智慧停车、智能安防等,为园区员工、企业及访客提供了便捷、舒适的生活与工作体验。值得一提的是,智慧园区还充分利用大数据、云计算等先进技术,对园区的能耗数据进行采集、分析与管理,实现了绿色、节能的运营目标。 在智慧园区的建设过程中,还涌现出了许多创新的应用场景。例如,在环境监测方面,智慧园区通过集成各类传感器与监控系统,实现了对园区水质、空气质量的实时监测与预警;在交通管理方面,智慧园区利用物联网技术,对园区观光车、救援车辆等进行实时定位与调度,提高了交通效率与安全性;在公共服务方面,智慧园区通过构建统一的公共服务平台,为园区居民提供了包括平安社区、便民社区、智能家居在内的多元化服务。这些创新应用不仅提升了园区的智能化水平,还为园区的可持续发展奠定了坚实基础。同时,智慧园区的建设也促进了产业链的聚合与发展,通过搭建聚合产业链平台,实现了园区内企业间的资源共享与合作共赢。总的来说,智慧园区的建设不仅提升了园区的综合竞争力,还为城市的智慧化发展树立了典范。它以用户需求为导向,以技术创新为驱动,不断推动着园区向更加智慧、高效、绿色的方向发展。对于写方案的读者而言,智慧园区的成功案例与创新应用无疑提供了宝贵的借鉴与启示,值得深入探索与学习。

    数据库系统课程设计报告-商品供应管理系统设计与开发

    一、系统需求分析 1 (一)需求概述 1 (二)业务流分析 1 (三)数据流分析 3 (四)数据字典 3 二、数据库概念结构设计 5 (一)实体分析 5 (二)属性分析 5 (三)联系分析 6 (四)概念模型分析(.PDM图) 7 三、数据库逻辑结构设计 8 (一)概念模型转化为逻辑模型 8 1.一对一关系的转化 8 2.一对多关系的转化 8 3.多对多关系的转化 8 (二)逻辑模型设计(.PDM图) 8 四、数据库物理实现 9 (一)表设计 9 (二)创建表和完整性约束代码设计 10 (三)创建视图、索引、存储过程和触发器 11 五、数据库功能调试 12 (一)职工管理模块 12 (二)工程负责人管理模块 13 (三)系统管理员管理模块 15 六、设计系统前台软件 20 (一)开发软件选择 20 (二)软件功能要求与设计 21 (三)软件功能实现 21 (四)系统测试 27 七、设计总结 28

    springboot校园在线拍卖系统.zip

    ava项目springboot基于springboot的课程设计,包含源码+数据库+毕业论文

    【人机交互】MATLAB手势识别设计.zip

    【人机交互】MATLAB手势识别设计

    【工程项目】MATLAB的人脸+指纹融合系统(结合人脸和指纹一致性方可通行).zip

    【工程项目】MATLAB的人脸+指纹融合系统(结合人脸和指纹一致性方可通行)

    2023年历年真题考试:管理系统中计算机应用历年真题汇编(共207题).pdf

    2023年历年真题考试:管理系统中计算机应用历年真题汇编(共207题).pdf

    sprinmgboot实习管理系统--论文.zip

    ava项目springboot基于springboot的课程设计,包含源码+数据库+毕业论文

    【人机交互】MATLAB信号与系统数字信号设计.zip

    【人机交互】MATLAB信号与系统数字信号设计

Global site tag (gtag.js) - Google Analytics