android中ContactsContract获取联系人的方法 (转)

http://zymic.iteye.com/blog/737643android中ContactsContract获取联系人的方法
从Android 2.0 SDK开始有关联系人provider的类变成了ContactsContract,虽然老的android.provider.Contacts能用,但是在SDK中标记为为deprecated将被放弃不推荐的方法,而从Android 2.0及API Level为5开始新增了android.provider.ContactsContract来代替原来的方法。

ContactsContract的子类ContactsContract.Contacts是一张表,代表了所有联系人的统计信息。比如联系人ID(—ID),查询键(LOOKUP_KEY),联系人的姓名(DISPLAY_NAME_PRIMARY),头像的id(PHOTO_ID)以及群组的id等等。

我们可以通过以下的方法取得所有联系人的表的Cursor对象:

1)ContentResolver contentResolver=getContentResolver();//获取ContentResolver对象查询在ContentProvider里定义的共享对象;

2)Cursor cursor=contentResolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);//根据URI对象ContactsContract.Contacts.CONTENT_URI查询所有联系人;

从Cursor对象里我们关键是要取得联系人的_id。通过它,再通过ContactsContract.CommonDataKinds的各个子类查询该_id联系人的电话(ContactsContract.CommonDataKinds.Phone),email(ContactsContract.CommonDataKinds.Email)等等。

以取得该联系人所有电话为例:

1)int idFieldIndex=cursor.getColumnIndex(ContactsContract.Contacts._ID);

int id=cursor.getInt(idFieldIndex);//根据列名取得该联系人的id;

2)Cursor phonecursor=contentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"=?", new String[]{Integer.toString(id)}, null);//再类ContactsContract.CommonDataKinds.Phone中根据查询相应id联系人的所有电话;

类似地可以ContactsContract.CommonDataKinds的不同的子类查询不同的内容。android文档告诉我们推荐使用ContactsContract.Contacts.LOOKUP_KEY代替ContactsContract.Contacts._ID。

最后,由于读取联系人比较的占用资源,为了提高用户的体验度。考虑将读取的过程放在线程里完成,推荐使用AsyncTask类。

1 package jtapp.contacts;
2
3 import java.util.ArrayList;
4 import java.util.HashMap;
5 import java.util.List;
6
7 import android.app.ListActivity;
8 import android.database.Cursor;
9 import android.os.Bundle;
10 import android.provider.ContactsContract;
11 import android.widget.SimpleAdapter;
12
13 public class ViewContacts extends ListActivity {
14/***//**Calledwhentheactivityisfirstcreated.*/
15@Override
16publicvoidonCreate(BundlesavedInstanceState){
17super.onCreate(savedInstanceState);
18setContentView(R.layout.main);
19
20List<HashMap<String,String>>items=fillMaps();
21SimpleAdapteradapter=newSimpleAdapter(
22this,items,R.layout.list_item,
23newString[]{"name","key"},
24newint[]{R.id.item,R.id.item2});
25this.setListAdapter(adapter);
26
27}

28
29privateList<HashMap<String,String>>fillMaps(){
30List<HashMap<String,String>>items=newArrayList<HashMap<String,String>>();
31
32Cursorcur=null;
33try{
34//QueryusingContentResolver.queryorActivity.managedQuery
35cur=getContentResolver().query(
36ContactsContract.Contacts.CONTENT_URI,null,null,null,null);
37if(cur.moveToFirst()){
38intidColumn=cur.getColumnIndex(
39ContactsContract.Contacts._ID);
40intdisplayNameColumn=cur.getColumnIndex(
41ContactsContract.Contacts.DISPLAY_NAME);
42//Iterateallusers
43do{
44StringcontactId;
45StringdisplayName;
46StringphoneNumber="";
47//Getthefieldvalues
48contactId=cur.getString(idColumn);
49displayName=cur.getString(displayNameColumn);
50//Getnumberofuser'sphoneNumbers
51intnumberCount=cur.getInt(cur.getColumnIndex(
52ContactsContract.Contacts.HAS_PHONE_NUMBER));
53if(numberCount>0){
54Cursorphones=getContentResolver().query(
55ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
56null,
57ContactsContract.CommonDataKinds.Phone.CONTACT_ID
58+"="+contactId
59/**//*+"and"+ContactsContract.CommonDataKinds.Phone.TYPE
60+"="+ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE*/
,
61null,null);
62if(phones.moveToFirst()){
63intnumberColumn=phones.getColumnIndex(
64ContactsContract.CommonDataKinds.Phone.NUMBER);
65//Iterateallnumbers
66do{
67phoneNumber+=phones.getString(numberColumn)+",";
68}
while(phones.moveToNext());
69}

70}

71//Addvaluestoitems
72HashMap<String,String>i=newHashMap<String,String>();
73i.put("name",displayName);
74i.put("key",phoneNumber);
75items.add(i);
76}
while(cur.moveToNext());
77}
else{
78HashMap<String,String>i=newHashMap<String,String>();
79i.put("name","YourPhone");
80i.put("key","HaveNoContacts.");
81items.add(i);
82}

83}
finally{
84if(cur!=null)
85cur.close();
86}

87returnitems;
88}

89}


更多相关文章

  1. android 3D 游戏实现之综合实例(初步)
  2. Android实现ListView异步加载图片总结
  3. android之Handler的使用,回到主线程更新UI的四种方法
  4. Android知识点总结(十五) Android(安卓)MVP 简易模型
  5. 面试题总结(2018.7.26开始,持续更新中)
  6. android进程间通信:使用AIDL
  7. android Wifi的补充
  8. Android(安卓)属性动画(一)
  9. PreferenceActivity使用介绍

随机推荐

  1. Static interface methods are only supp
  2. Android手机屏幕的三种状态
  3. Android 画图之Matrix(二)
  4. SpringSource通过Spring for Android 1.0
  5. android APP如何实现launcher
  6. android:targetSdkVersion引起的问题
  7. IDEA启动android emulator报错
  8. Android设备唯一标识符(适配Android Q)
  9. Android大数据、断点续传、耗时下载之Dow
  10. 【起航计划 002】2015 起航计划 Android