android通讯录开发<三> 增删改查(附Demo)
2017-10-13 18:29
393 查看
不废话,直接开撸
主要逻辑代码如下单查询/增加联系人
/** * 写入手机联系人 */ private void writeContact() { String name = "test"; String number = "13666668888"; //先查询要添加的号码是否已存在通讯录中, 不存在则添加. 存在则提示用户 Uri uri = Uri.parse("content://com.android.contacts/data/phones/filter/" + number); ContentResolver resolver = getContentResolver(); //从raw_contact表中返回display_name Cursor cursor = resolver.query(uri, new String[]{ContactsContract.Data.DISPLAY_NAME}, null, null, null); if (cursor == null) return; if (cursor.moveToFirst()) { Log.i("nn", "name=" + cursor.getString(0)); Toast.makeText(this, "存在相同号码", Toast.LENGTH_SHORT).show(); } else { uri = Uri.parse("content://com.android.contacts/raw_contacts"); ContentValues values = new ContentValues(); long contact_id = ContentUris.parseId(resolver.insert(uri, values)); //插入data表 uri = Uri.parse("content://com.android.contacts/data"); //add Name values.put("raw_contact_id", contact_id); values.put(ContactsContract.Data.MIMETYPE, "vnd.android.cursor.item/name"); values.put("data2", "qq"); values.put("data1", name); resolver.insert(uri, values); values.clear(); //add Phone values.put("raw_contact_id", contact_id); values.put(ContactsContract.Data.MIMETYPE, "vnd.android.cursor.item/phone_v2"); values.put("data2", "2"); //手机 values.put("data1", number); resolver.insert(uri, values); values.clear(); //add email values.put("raw_contact_id", contact_id); values.put(ContactsContract.Data.MIMETYPE, "vnd.android.cursor.item/email_v2"); values.put("data2", "1"); //邮箱 values.put("data1", "xxxx@qq.com"); resolver.insert(uri, values); values.clear(); //add organization values.put("raw_contact_id", contact_id); values.put(ContactsContract.Data.MIMETYPE, "vnd.android.cursor.item/organization"); values.put("data4", "产品经理"); //职务 values.put("data1", "腾讯科技"); //公司 resolver.insert(uri, values); values.clear(); Toast.makeText(this, "插入号码成功", Toast.LENGTH_SHORT).show(); } cursor.close(); }
注意: 使用魅族手机测试得到一个有趣的结果, 如果query时传入的只是一段短小的号码, 比如: 13612 那么会返回所有匹配包含到这各字段的结果, 例如有两个号码分别是 13612 99 8888 / 139 13612 888 .
那么最终查询则会返回号码存在的结果
删除联系人
/** * 删除联系人 */ private void deleteContact() { String name = "test"; //根据姓名求id Uri uri = Uri.parse("content://com.android.contacts/raw_contacts"); ContentResolver resolver = getContentResolver(); Cursor cursor = resolver.query(uri, new String[]{ContactsContract.Data._ID}, "display_name=?", new String[]{name}, null); if (cursor == null) return; if (cursor.moveToFirst()) { int id = cursor.getInt(0); //根据id删除data中的相应数据 resolver.delete(uri, "display_name=?", new String[]{name}); uri = Uri.parse("content://com.android.contacts/data"); resolver.delete(uri, "raw_contact_id=?", new String[]{id + ""}); Toast.makeText(this, "删除号码成功", Toast.LENGTH_SHORT).show(); }else{ Toast.makeText(this, "没有找到号码", Toast.LENGTH_SHORT).show(); } cursor.close(); }
更改联系人
/** * 更改联系人 */ private void changeContact(){ String name = "test"; String newPhone = "13644440000"; //根据姓名求id Uri uri = Uri.parse("content://com.android.contacts/raw_contacts"); ContentResolver resolver = getContentResolver(); Cursor cursor = resolver.query(uri, new String[]{ContactsContract.Data._ID}, "display_name=?", new String[]{name}, null); if (cursor == null) return; if (cursor.moveToFirst()) { int id = cursor.getInt(0); ContentValues values = new ContentValues(); values.put("data1", newPhone); resolver.update(uri, values, "mimetype=? and raw_contact_id=?", new String[]{"vnd.android.cursor.item/phone_v2", id + ""}); }else{ Toast.makeText(this, "没有找到号码", Toast.LENGTH_SHORT).show(); } cursor.close(); }
列表查询
private List<HashMap<String, String>> mContactList = new ArrayList<>(); /** * 查询手机联系人并显示 */ private void queryContactsShowData() { mContactList.clear(); Cursor cursor = getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, null, null, null); if (cursor == null) return; while (cursor.moveToNext()) { String phoneName; String phoneNumber; HashMap<String, String> listItem = new HashMap<>(); phoneName = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME)); phoneNumber = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)); listItem.put("phoneName", phoneName); listItem.put("phoneNumber", phoneNumber); mContactList.add(listItem); } cursor.close(); mRv.setAdapter(new ContactAdapter()); mRv.setLayoutManager(new LinearLayoutManager(mContext)); }
附上测试的Demo
https://gitee.com/geekqian/ContactDemo/tree/master
相关文章推荐
- Android学习之多线程开发总结<三>
- (转)Android开发工具——ADB(Android Debug Bridge) <三>DalvikVM之jdwp线程
- android通讯录开发<二> 数据表各字段含义
- android通讯录开发<一> 导出数据库
- <Android>在android开发中实现一行文字流动
- 初学Android项目:开发电子市场<第三天>
- android 检查网络连接状态实现步骤<三>
- 【Android高级】应用开发必须要掌握的框架<Volley>
- Android开发工具——ADB(Android Debug Bridge) <三>DalvikVM之jdwp线程
- [置顶] 模仿[一个] 制作的Android app<三>
- Android开发-API指南-<application>
- Android开发-API指南-<permission>
- Android开发-API指南-<service>
- Android Layout研究 <三> View的布局方式及实例
- Android开发-API指南-<manifest>
- Android开发-API指南-<uses-configuration>
- Android开发-API指南-<uses-sdk>
- IOS通讯录开发<1> 授权应用访问通讯录
- Android JNI/NDK开发之基本姿势<二>
- Android开发-API指南-<application>