Android使用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);
    }
  }
}

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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • Android ContentProvider实现获取手机联系人功能

    在之前项目中有用到关于获取手机联系人的部分,闲置就想和大家分享一下,话不多说,上代码: java部分: package com.example.content; import android.content.ContentResolver; import android.database.Cursor; import android.net.Uri; import android.support.v7.app.AppCompatActivity; import android.os.Bundle

  • Android获取手机联系人电话号码并返回结果

    之前做了一个小练习需要用到获取手机里联系人的电话号码,通过查阅相关的资料,自己尝试写了一个小例子,可以成功获取. 首先需要在AndroidManifest.xml中获取权限 <uses-permission android:name="android.permission.READ_CONTACTS"/> xml布局文件 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/andro

  • Android获取联系人头像的方法

    本文实例讲述了Android获取联系人头像的方法.分享给大家供大家参考,具体如下: public byte[] getPhoto(String people_id) { String photo_id = null; String selection1 = ContactsContract.Contacts._ID + " = " + people_id; Cursor cur1 = getContentResolver().query( ContactsContract.Contac

  • Android实现获取联系人电话号码功能

    本篇文档主要记录一下获取联系人的电话号码的一种方式. 1.选择联系人 ............ //构造一个隐式的Intent,拉起联系人界面 final Intent pickIntent = new Intent(Intent.ACTION_PICK, ContactsContract.Contacts.CONTENT_URI); mSuspectButton = (Button)v.findViewById(R.id.crime_suspect); mSuspectButton.setOn

  • Android 获取手机联系人实例代码详解

    我的风格,废话不多说了,直接给大家贴代码了. 具体代码如下所示: package com.org.demo.demo; import com.org.wangfeng.R; import android.app.Activity; import android.content.Intent; import android.os.Bundle; import android.util.Log; import android.view.View; import android.widget.Butt

  • Android获取手机联系人信息

    Android如何获取手机联系人信息,本文为大家揭晓. 获取手机联系人信息步骤: 1.获取 ContentResolver ContentResolver resolver = getContentResolver(); 2.resolver.query(*)查询信息 查询手机联系人的URI:ContactsContract.RawContacts.CONTENT_URI 查询手机联系人手机号的URI:ContactsContract.CommonDataKinds.Phone.CONTENT_

  • Android获取手机通讯录、sim卡联系人及调用拨号界面方法

    android获取手机通讯录联系人信息 复制代码 代码如下: private void getPhoneContacts() {        ContentResolver resolver = this.getContentResolver();                // 获取手机联系人       Cursor phoneCursor = resolver.query(Phone.CONTENT_URI,                  new String[] { Phone

  • android获取联系人示例分享

    复制代码 代码如下: package com.homer.phone; import java.util.ArrayList;import java.util.HashMap; import android.app.Activity;import android.database.Cursor;import android.os.Bundle;import android.provider.ContactsContract;import android.provider.ContactsCont

  • Android编程操作联系人的方法(查询,获取,添加等)

    本文实例讲述了Android编程操作联系人的方法.分享给大家供大家参考,具体如下: Android系统中的联系人也是通过ContentProvider来对外提供数据的,我们这里实现获取所有联系人.通过电话号码获取联系人.添加联系人.使用事务添加联系人. 获取所有联系人 1. Android系统中的联系人也是通过ContentProvider来对外提供数据的 2. 数据库路径为:/data/data/com.android.providers.contacts/database/contacts2

  • Android获取联系人姓名和电话代码

    在开发中往往有要获取联系人列表的功能,但是这次却不是获取联系人列表,而是在联系人列表点击单个联系人,获取单个联系人的姓名和电话,并设置在指定的输入框内,方便用户的使用:以下是实现的代码: <?xml version="1.0" encoding="utf-8"?> <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:la

随机推荐