全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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); 
    } 
  } 
} 

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

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


# Android  # AsyncQueryHandler  # 联系人  # Android ContentProvider实现手机联系人读取和插入  # Android读取手机通讯录联系人到自己项目  # android仿微信联系人索引列表功能  # Android保存联系人到通讯录的方法  # android如何获取联系人所有信息  # Android ContentProvider实现获取手机联系人功能  # Android 获取手机联系人实例代码详解  # android实现读取、搜索联系人的代码  # Android ContentProvider获取手机联系人实例  # Android小程序实现访问联系人  # 行号  # 放在  # 只需  # 要把  # 就行  # 也很  # 自定义  # 多说  # 大家多多  # 小工具  # getPhoneNum  # setPhoneNum  # setDisplayName  # setContactId  # getDisplayName  # setLookUpKey  # setPhotoId  # getLookUpKey  # getPhotoId  # getSortKey 


相关文章: 如何在企业微信快速生成手机电脑官网?  定制建站流程解析:需求评估与SEO优化功能开发指南  黑客如何通过漏洞一步步攻陷网站服务器?  C++用Dijkstra(迪杰斯特拉)算法求最短路径  制作网站的软件下载免费,今日头条开宝箱老是需要下载怎么回事?  西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?  开封网站制作公司,网络用语开封是什么意思?  制作表格网站有哪些,线上表格怎么弄?  网站制作难吗安全吗,做一个网站需要多久时间?  如何通过多用户协作模板快速搭建高效企业网站?  宝塔面板创建网站无法访问?如何快速排查修复?  制作网站哪家好,cc、.co、.cm哪个域名更适合做网站?  清单制作人网站有哪些,近日“兴风作浪的姑奶奶”引起很多人的关注这是什么事情?  重庆市网站制作公司,重庆招聘网站哪个好?  如何在腾讯云免费申请建站?  如何将凡科建站内容保存为本地文件?  建站org新手必看:2024最新搭建流程与模板选择技巧  建站之星免费版是否永久可用?  mc皮肤壁纸制作器,苹果平板怎么设置自己想要的壁纸我的世界?  网站制作多少钱一个,建一个论坛网站大约需要多少钱?  c++怎么使用类型萃取type_traits_c++ 模板元编程类型判断【方法】  家具网站制作软件,家具厂怎么跑业务?  Swift开发中switch语句值绑定模式  如何注册花生壳免费域名并搭建个人网站?  建站一年半SEO优化实战指南:核心词挖掘与长尾流量提升策略  如何在宝塔面板中修改默认建站目录?  音响网站制作视频教程,隆霸音响官方网站?  整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?  香港服务器部署网站为何提示未备案?  如何获取免费开源的自助建站系统源码?  如何快速启动建站代理加盟业务?  可靠的网站设计制作软件,做网站设计需要什么样的电脑配置?  怎么将XML数据可视化 D3.js加载XML  如何通过.red域名打造高辨识度品牌网站?  C#如何使用XPathNavigator高效查询XML  沈阳制作网站公司排名,沈阳装饰协会官方网站?  网站app免费制作软件,能免费看各大网站视频的手机app?  盐城做公司网站,江苏电子版退休证办理流程?  建站主机解析:虚拟主机配置与服务器选择指南  新网站制作渠道有哪些,跪求一个无线渠道比较强的小说网站,我要发表小说?  东莞市网站制作公司有哪些,东莞找工作用什么网站好?  邀请函制作网站有哪些,有没有做年会邀请函的网站啊?在线制作,模板很多的那种?  简易网站制作视频教程,使用记事本编写一个简单的网页html文件?  整蛊网站制作软件,手机不停的收到各种网站的验证码短信,是手机病毒还是人为恶搞?有这种手机病毒吗?  网站插件制作软件免费下载,网页视频怎么下到本地插件?  如何通过老薛主机一键快速建站?  陕西网站制作公司有哪些,陕西凌云电器有限公司官网?  建站之家VIP精选网站模板与SEO优化教程整合指南  详解一款开源免费的.NET文档操作组件DocX(.NET组件介绍之一)  香港服务器WordPress建站指南:SEO优化与高效部署策略 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。