通过ContentProvider获取联系人信息,并进行crud

1. 首先是读写权限的申明:

<uses-permission android:name="android.permission.READ_CONTACTS"/>
<uses-permission android:name="android.permission.WRITE_CONTACTS"/>

2. Java代码

  1 package com.bwf.contacts;
  2 
  3 import java.util.ArrayList;
  4 import java.util.HashMap;
  5 import java.util.List;
  6 
  7 import android.net.Uri;
  8 import android.os.Bundle;
  9 import android.provider.ContactsContract;
 10 import android.provider.ContactsContract.CommonDataKinds.Email;
 11 import android.provider.ContactsContract.CommonDataKinds.Phone;
 12 import android.provider.ContactsContract.CommonDataKinds.StructuredName;
 13 import android.provider.ContactsContract.Data;
 14 import android.provider.ContactsContract.RawContacts;
 15 import android.app.Activity;
 16 import android.app.ProgressDialog;
 17 import android.content.ContentResolver;
 18 import android.content.ContentUris;
 19 import android.content.ContentValues;
 20 import android.database.Cursor;
 21 import android.util.Log;
 22 import android.view.Menu;
 23 import android.view.MenuItem;
 24 import android.view.View;
 25 import android.widget.AdapterView;
 26 import android.widget.AdapterView.OnItemClickListener;
 27 import android.widget.ArrayAdapter;
 28 import android.widget.ListView;
 29 import android.widget.TextView;
 30 import android.widget.Toast;
 31 
 32 public class MainActivity extends Activity {
 33     // 展示联系人姓名
 34     ListView lv;
 35     // 联系人数量
 36     TextView tv_count;
 37     // ContentResolver对象
 38     ContentResolver resolver;
 39     // 联系人Uri
 40     Uri contactsUri = ContactsContract.Contacts.CONTENT_URI;
 41     // 电话Uri
 42     Uri phoneUri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
 43     // 邮箱Uri
 44     Uri mailUri = ContactsContract.CommonDataKinds.Email.CONTENT_URI;
 45     // 存储联系人姓名的容器
 46     List<String> nameList = new ArrayList<String>();
 47     // 存储联系人详细信息的容器:主要存电话和邮箱
 48     List<HashMap> detailList = new ArrayList<HashMap>();
 49     // ArrayAdapter将姓名映射到ListView
 50     ArrayAdapter<String> adapter;
 51     // 联系人数量
 52     int count;
 53 
 54     @Override
 55     protected void onCreate(Bundle savedInstanceState) {
 56         super.onCreate(savedInstanceState);
 57         setContentView(R.layout.activity_main);
 58 
 59         lv = (ListView) findViewById(R.id.lv);
 60         tv_count = (TextView) findViewById(R.id.tv);
 61         resolver = getContentResolver();
 62     }
 63 
 64     @Override
 65     public boolean onCreateOptionsMenu(Menu menu) {
 66         // Inflate the menu; this adds items to the action bar if it is present.
 67         getMenuInflater().inflate(R.menu.main, menu);
 68         return true;
 69     }
 70 
 71     @Override
 72     public boolean onOptionsItemSelected(MenuItem item) {
 73         switch (item.getItemId()) {
 74         case R.id.action_add:
 75             add();
 76             break;
 77         case R.id.action_del:
 78             del();
 79             break;
 80         case R.id.action_mod:
 81             update();
 82             break;
 83         case R.id.action_search:
 84             search();
 85             //searchNew();
 86             break;
 87 
 88         default:
 89             break;
 90         }
 91         return super.onOptionsItemSelected(item);
 92     }
 93 
 94     private void update() {
 95         ContentValues contentValues = new ContentValues();
 96         contentValues.put(ContactsContract.Contacts.DISPLAY_NAME, "中国联通_1");
 97         int re = resolver.update(
 98                 ContactsContract.RawContacts.CONTENT_URI,
 99                 contentValues,
100                 ContactsContract.Contacts.DISPLAY_NAME+ " = ?",
101                 new String[]{"中国联通"}
102         );
103         
104         if(re > 0){
105             Toast.makeText(getApplicationContext(),
106                     "修改成功", Toast.LENGTH_LONG).show();
107         }
108         
109         searchNew();
110     }
111 
112     private void del() {
113         Uri delUri = ContactsContract.RawContacts.CONTENT_URI;
114         int re = resolver.delete(delUri, ContactsContract.Contacts.DISPLAY_NAME+" = '中国联通'", null);
115         
116         if (re > 0) {
117             Toast.makeText(MainActivity.this, "删除成功", Toast.LENGTH_SHORT).show();
118         }
119         searchNew();
120     }
121 
122     long insertId;
123     private void add() {
124         ContentValues values = new ContentValues();
125         // 向RawContacts.CONTENT_URI插入一个空的values
126         // 目的是要得到一个rawId
127         Uri u = resolver.insert(RawContacts.CONTENT_URI, values);
128         long rawId = ContentUris.parseId(u);
129         values.clear();
130         Log.d("fanhy", "插入数据联系人的id:"+rawId);
131         insertId = rawId;
132         
133         // 封装id
134         values.put(Data.RAW_CONTACT_ID, rawId);
135         // 封装内容类型
136         values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
137         // 封装联系人姓名
138         values.put(StructuredName.GIVEN_NAME, "中国联通");
139         // 向联系人Uri添加姓名
140         resolver.insert(android.provider.ContactsContract.Data.CONTENT_URI, values);
141         
142         values.clear();
143         // 封装id
144         values.put(Data.RAW_CONTACT_ID, rawId);
145         // 封装内容类型
146         values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
147         // 封装联系人电话号码
148         values.put(Phone.NUMBER, "10010");
149         // 封装电话号码类型
150         values.put(Phone.TYPE, Phone.TYPE_MOBILE);
151         // 向联系人电话Uri添加电话号码
152         resolver.insert(android.provider.ContactsContract.Data.CONTENT_URI, values);
153         
154         values.clear();
155         // 向联系人邮箱Uri中添加邮箱
156         // 封装id
157         values.put(Data.RAW_CONTACT_ID, rawId);
158         // 封装内容类型
159         values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
160         // 封装联系人电话号码
161         values.put(Email.DATA, "123456789@qq.com");
162         // 封装电话号码类型
163         values.put(Email.TYPE, Email.TYPE_WORK);
164         // 向联系人电话Uri添加电话号码
165         Uri i = resolver.insert(android.provider.ContactsContract.Data.CONTENT_URI, values);
166         
167         if(i != null){
168             Toast.makeText(MainActivity.this, "添加成功", Toast.LENGTH_SHORT).show();
169         }
170         //search();
171         searchNew();
172     }
173 
174     ProgressDialog dialog;
175     private void search() {
176         dialog = new ProgressDialog(this);
177         dialog.setTitle("正在查询");
178         dialog.show();
179         new Thread(new Runnable() {
180             
181             @Override
182             public void run() {
183                 // 查询联系人
184                 Cursor c1 = resolver.query(contactsUri, null, null, null, null);
185                 // 记录联系人数量
186                 count = c1.getCount();
187                 // 遍历联系人
188                 while (c1.moveToNext()) {
189                     HashMap map = new HashMap();
190                     // 得到联系人id
191                     String contactsId = c1.getString(c1
192                             .getColumnIndex(ContactsContract.Contacts._ID));
193                     // 得到联系人姓名
194                     String name = c1.getString(c1
195                             .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
196                     // 将姓名添加到容器nameList中
197                     nameList.add(name);
198 
199                     map.put("name", name);
200 
201                     // 通过phoneUri和contactsId查询该联系人的电话号码,由于可能有多个号码,所以定义一个容器来保存
202                     ArrayList<String> phoneList = new ArrayList<String>();
203                     // 查询联系人电话号码
204                     Cursor c2 = resolver.query(phoneUri, null,
205                             ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + contactsId, null,
206                             null);
207                     // 遍历电话号码
208                     while (c2.moveToNext()) {
209                         // 取出电话号码
210                         String phoneNum = c2
211                                 .getString(c2
212                                         .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
213                         // 将电话号码添加到容器中
214                         phoneList.add(phoneNum);
215                     }
216 
217                     map.put("phones", phoneList);
218                     // 关闭游标
219                     c2.close();
220 
221                     // 通过mailUri和contactsId查询该联系人的邮箱地址,由于可能有多个邮箱,所以定义一个容器来保存
222                     ArrayList<String> mailList = new ArrayList<String>();
223                     // 查询联系人邮箱地址
224                     Cursor c3 = resolver.query(mailUri, null,
225                             ContactsContract.CommonDataKinds.Email.CONTACT_ID + "=" + contactsId, null,
226                             null);
227                     // 遍历邮箱
228                     while (c3.moveToNext()) {
229                         // 取出邮箱
230                         String mail = c3
231                                 .getString(c3
232                                         .getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));
233                         // 将邮箱地址放入mailList中
234                         mailList.add(mail);
235                     }
236 
237                     map.put("mails", mailList);
238                     // 关闭游标
239                     c3.close();
240 
241                     detailList.add(map);
242                 }
243                 c1.close();
244                 
245                 // 更新UI
246                 runOnUiThread(new Runnable() {
247                     
248                     @Override
249                     public void run() {
250                         // 创建适配器
251                         adapter = new ArrayAdapter<String>(
252                                 MainActivity.this,
253                                 android.R.layout.simple_list_item_1,
254                                 android.R.id.text1,
255                                 nameList);
256                         // 绑定适配器
257                         lv.setAdapter(adapter);
258                         // 设置联系人数量展示
259                         tv_count.setText("查询到"+count+"条联系人信息");
260                         
261                         dialog.dismiss();
262                         
263                         lv.setOnItemClickListener(new OnItemClickListener() {
264 
265                             @Override
266                             public void onItemClick(AdapterView<?> parent,
267                                     View view, int position, long id) {
268                                 HashMap map = detailList.get(position);
269                                 // 获取姓名
270                                 String name = (String) map.get("name");
271                                 // 获取第一个电话号码
272                                 String phone = (String) ((List)map.get("phones")).get(0);
273                                 Toast.makeText(getApplicationContext(), 
274                                         name+":"+phone, Toast.LENGTH_LONG).show();
275                             }
276                         });
277                     }
278                 });
279             }
280         }).start();
281 
282         
283     }
284     
285     List<String> idList = new ArrayList<String>();
286     private void searchNew() {
287         dialog = new ProgressDialog(this);
288         dialog.setTitle("正在查询");
289         dialog.show();
290         new Thread(new Runnable() {
291             
292             @Override
293             public void run() {
294                 // 查询联系人
295                 Cursor c1 = resolver.query(contactsUri, null, null, null, null);
296                 // 记录联系人数量
297                 count = c1.getCount();
298                 // 遍历联系人
299                 while (c1.moveToNext()) {
300                     HashMap map = new HashMap();
301                     // 得到联系人id
302                     String contactsId = c1.getString(c1
303                             .getColumnIndex(ContactsContract.Contacts._ID));
304                     // 得到联系人姓名
305                     String name = c1.getString(c1
306                             .getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
307                     
308                     nameList.add(name);
309                     idList.add(contactsId);
310                 }
311                 // 更新UI
312                 runOnUiThread(new Runnable() {
313                     
314                     @Override
315                     public void run() {
316                         // 创建适配器
317                         adapter = new ArrayAdapter<String>(
318                                 MainActivity.this,
319                                 android.R.layout.simple_list_item_1,
320                                 android.R.id.text1,
321                                 nameList);
322                         // 绑定适配器
323                         lv.setAdapter(adapter);
324                         setContactsCount();
325                         
326                         dialog.dismiss();
327                         
328                         lv.setOnItemClickListener(new OnItemClickListener() {
329                             
330                             @Override
331                             public void onItemClick(AdapterView<?> parent,
332                                     View view, int position, long id) {
333                                 // 获取姓名
334                                 String name = nameList.get(position);
335                                 // 通过id取电话
336                                 String contactsId = idList.get(position);
337                                 
338                                 Cursor c2 = resolver.query(phoneUri, null,
339                                         ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + contactsId, null,
340                                         null);
341                                 c2.moveToPosition(0);
342                                 // 获取第一个电话号码
343                                 String phone = c2
344                                         .getString(c2
345                                                 .getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
346                                 Toast.makeText(getApplicationContext(), 
347                                         name+":"+phone, Toast.LENGTH_LONG).show();
348                             }
349                         });
350                     }
351 
352                 });
353             }
354         }).start();
355         
356         
357     }
358     private void setContactsCount() {
359         // 设置联系人数量展示
360         tv_count.setText("查询到"+count+"条联系人信息");
361     }
362 }

 

posted on 2015-10-14 16:59  敬的男人  阅读(325)  评论(0)    收藏  举报