当前位置: 移动技术网 > 移动技术>移动开发>Android > Android使用AsyncQueryHandler实现获取手机联系人功能

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

2019年07月24日  | 移动技术网移动技术  | 我要评论

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

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

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

如对本文有疑问, 点击进行留言回复!!

相关文章:

验证码:
移动技术网