通过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 }
浙公网安备 33010602011771号