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}
更多相关文章
- android 3D 游戏实现之综合实例(初步)
- Android实现ListView异步加载图片总结
- android之Handler的使用,回到主线程更新UI的四种方法
- Android知识点总结(十五) Android(安卓)MVP 简易模型
- 面试题总结(2018.7.26开始,持续更新中)
- android进程间通信:使用AIDL
- android Wifi的补充
- Android(安卓)属性动画(一)
- PreferenceActivity使用介绍