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

时间:2022-07-28
本文章向大家介绍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); 
} 
} 
} 

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

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