life02

  C++博客 :: 首页 :: 新随笔 :: 联系 :: 聚合  :: 管理 ::
  197 随笔 :: 3 文章 :: 37 评论 :: 0 Trackbacks

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类。

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

28
29        private List<HashMap<String, String>> fillMaps() {
30                List<HashMap<String, String>> items = new ArrayList<HashMap<String, String>>();
31
32                Cursor cur = null;
33                try {
34                        // Query using ContentResolver.query or Activity.managedQuery
35                        cur = getContentResolver().query(
36                                        ContactsContract.Contacts.CONTENT_URI, nullnullnullnull);
37                        if (cur.moveToFirst()) {
38                                int idColumn = cur.getColumnIndex(
39                                                ContactsContract.Contacts._ID);
40                        int displayNameColumn = cur.getColumnIndex(
41                                        ContactsContract.Contacts.DISPLAY_NAME);
42                                // Iterate all users
43                        do {
44                                        String contactId;
45                                        String displayName;
46                                        String phoneNumber = "";
47                                        // Get the field values
48                                        contactId = cur.getString(idColumn);
49                                        displayName = cur.getString(displayNameColumn);
50                                        // Get number of user's phoneNumbers
51                                        int numberCount = cur.getInt(cur.getColumnIndex(
52                                                        ContactsContract.Contacts.HAS_PHONE_NUMBER));
53                                        if (numberCount>0{
54                                                Cursor phones = getContentResolver().query(
55                                                                ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
56                                                                null,
57                                                                ContactsContract.CommonDataKinds.Phone.CONTACT_ID 
58                                                                + " = " + contactId 
59                                                                /*+ " and " + ContactsContract.CommonDataKinds.Phone.TYPE 
60                                                                + "=" + ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE*/
,
61                                                                nullnull);
62                                                if (phones.moveToFirst()) {
63                                                        int numberColumn = phones.getColumnIndex(
64                                                                        ContactsContract.CommonDataKinds.Phone.NUMBER);
65                                                        // Iterate all numbers
66                                                        do {
67                                                                phoneNumber += phones.getString(numberColumn) + ",";
68                                                        }
 while (phones.moveToNext());
69                                                }
 
70                                        }

71                                        // Add values to items
72                                        HashMap<String, String> i = new HashMap<String, String>();
73                                        i.put("name", displayName);
74                                        i.put("key", phoneNumber);
75                                        items.add(i);
76                                }
 while (cur.moveToNext());
77                        }
 else {
78                                HashMap<String, String> i = new HashMap<String, String>();
79                                i.put("name""Your Phone");
80                                i.put("key""Have No Contacts.");
81                                items.add(i);
82                        }

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

87                return items;
88        }

89}


posted on 2012-01-18 16:34 life02 阅读(658) 评论(0)  编辑 收藏 引用 所属分类: Android开发

只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理