`
zhonglunshun
  • 浏览: 137941 次
  • 性别: 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`,用户点击这个按钮时,程序将启动获取联系...

    QuickContactBadge和AsyncQueryHandler实现联系人列表

    本代码是QuickContactBadge和AsyncQueryHandler实现联系人列表的完美实现,对初级程序员会有很大的帮助,可以直接拿来用,还带了首字母拼音的滑动栏,里面有自定义控件可以让你好好学习

    Android 小积累之AsyncQueryHandler用法

    总的来说,`AsyncQueryHandler`是Android系统提供的一种简单而有效的异步数据库操作工具,特别适合于简单的查询操作。然而,对于复杂的事务或需要精细控制的场景,开发者可能需要考虑使用其他解决方案,如`...

    使用AsyncQueryHandler操作ContentProvider

    - projection:指定要获取哪些列。 - selection:筛选条件,如果不需要筛选,可以为空字符串。 - selectionArgs:与筛选条件配合使用的参数,如果不需要,可以传null。 - sortOrder:数据排序方式,如果不需要排序,...

    contentprovider异步查询帮助类:AsyncQueryHandler

    而`AsyncQueryHandler`是Android系统提供的一个辅助类,用于在ContentProvider中执行异步查询操作,避免阻塞主线程,提升用户体验。这篇博客()可能会详细解析这个帮助类的工作原理和使用方法。 `...

    AsyncQueryHandler及ContentProvider代码实例

    `AsyncQueryHandler` 基于 `AsyncTask`,但使用更简单,尤其适合与 `ContentProvider` 结合使用。使用步骤包括: 1. 创建一个 `AsyncQueryHandler` 的实例,通常在需要执行查询的Activity或Fragment中。 2. 调用 `...

    android Contacts增删改查.docx

    - `mQueryHandler`是`QueryHandler`的实例,它继承自`AsyncQueryHandler`,负责异步查询联系人数据。 - 在`onResume`方法中,会检查是否需要执行查询。如果是在默认模式下,并且是第一次打开应用,会调用`...

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

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

    Android Contacts查询全过程

    此篇文章聚焦于Android系统中联系人数据的查询机制,尤其是通过代码层面解析这一过程,为开发者提供深入理解与实践指导。 ### Android Contacts查询全过程概述 在Android系统中,联系人数据存储于Content Provider...

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

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

    Android-QuickSearchBox程序源码.zip

    在Android系统中,QuickSearchBox(QSB)是一个非常重要的组件,它提供了全局搜索功能,允许用户快速查找应用程序内的数据、联系人、网页以及更多其他内容。本篇文章将深入探讨Android-QuickSearchBox程序源码,解析...

    android AlphabetListView

    这个控件通常用于显示大量需要分类的数据,比如联系人列表。在本文中,我们将深入探讨`AlphabetListView`的工作原理、如何使用以及其与`AsyncQueryHandler`的结合。 ### 1. `AlphabetListView`概述 `...

    日历事件多条删除

    1. 在`Fragment`中获取用户选择的日历事件ID列表。 2. 使用`AsyncQueryHandler`的`startDelete()`方法,传入ContentResolver、URI(代表日历事件的表)、事件ID列表以及一个操作完成后的回调接口。 3. 在回调接口的`...

    程序员简历模板12.doc

    他使用AsyncQueryHandler进行异步查询,实现了ListView滑动、联系人自动提示、草稿自动保存等特性。 3. **手机万能播放器**:该应用支持多种音视频格式的本地和在线播放,还具有视频下载和搜索功能。他在项目中负责...

    安卓数据库操作案例

    本案例主要探讨了如何使用Android的SQLite数据库,以及与之相关的组件和工具,如ContentProvider、AsyncQueryHandler和SQLiteOpenHelper。以下是这些关键知识点的详细说明。 1. **SQLite数据库**: 安卓系统默认支持...

    android学习笔记之消息机制,异步和多线程.pdf

    `Message`可以通过`obtainMessage()`获取,以避免额外的内存分配,也可以手动创建并配置。每个`Handler`实例只能处理由自身`obtainMessage()`或配置为可处理的消息。 `Handler`的发送和接收消息机制保证了消息的...

    android学习笔记之消息机制,异步和多线程[参考].pdf

    `Message`是承载数据的对象,可以通过`Handler`的`obtainMessage()`方法获取,或者手动创建并配置。 然而,如果要在其他线程中处理消息,就需要自定义`Looper`。这通常在服务或后台线程中进行,以便在不影响UI线程...

    android 识别U盘以及读写文件的方法

    接着,利用`AsyncQueryHandler`发起查询,获取存储设备的信息。`QueryArg` 类用于封装查询的相关参数,如URI、投影列、选择条件等,以便在回调`onQueryComplete()` 中区分不同的查询请求。 2. **安全弹出U盘** 弹...

Global site tag (gtag.js) - Google Analytics