利用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); } } }
小工具,供人参考,方便广大程序员,欢迎指正。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持移动技术网。
如对本文有疑问, 点击进行留言回复!!
Xamarin 安卓 相机 各种坑 目标API Android 6以后,我选的目标API版本是 Android 10
Android 9.0+软件某些功能突然暴毙:cleartext not permitted
Android : Resource is not a Drawable (color or path)
Flutter问题集锦——Android Studio 4.0.1 在AVD Manger中启动模拟器报“unable to locate abd”
网友评论