Android开发中用得较多的一项功能,具体示例代码如下:

 

import java.util.ArrayList;import android.content.ContentProviderOperation;import android.content.ContentProviderResult;import android.content.ContentResolver;import android.content.ContentUris;import android.content.ContentValues;import android.database.Cursor;import android.net.Uri;import android.provider.ContactsContract;import android.provider.ContactsContract.CommonDataKinds.Email;import android.provider.ContactsContract.CommonDataKinds.Phone;import android.provider.ContactsContract.CommonDataKinds.StructuredName;import android.provider.ContactsContract.Data;import android.provider.ContactsContract.RawContacts;import android.test.AndroidTestCase;import android.util.Log;public class ContactTest extends AndroidTestCase {private final static String TAG = "ContactTest" ;//通过ContentResolver得到通讯录信息public void testGetContactAll() throws Exception{StringBuilder sb = new StringBuilder() ;//得到通讯录的内容提供者的URIUri uri = ContactsContract.Contacts.CONTENT_URI ;ContentResolver provider = this.getContext().getContentResolver() ;//通过内容提供者查询得到通讯录联系人基本信息列表Cursor cursor = provider.query(uri, null, null, null, null) ;while(cursor.moveToNext()){sb.delete(0, sb.length()) ;//联系人主键IDString contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)) ;String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)) ;sb.append("contact_id=");sb.append(contactId);sb.append(",name=") ;sb.append(name) ;//根据联系人主键得到所有电话号码Cursor phoneCursor = provider.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"="+contactId, null, null) ;while(phoneCursor.moveToNext()){  String phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)) ;  sb.append(",number=") ;sb.append(phoneNumber) ;}phoneCursor.close() ;//根据联系人主键得到所有EmailCursor emailCursor = provider.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID+"="+contactId, null, null) ;while(emailCursor.moveToNext()){  String phoneNumber = emailCursor.getString(emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)) ;  sb.append(",email=") ;sb.append(phoneNumber) ;}emailCursor.close() ;}cursor.close() ;Log.i(TAG, sb.toString()) ;}/** * 常规思路添加通讯录(但各项添加均为单独的操作,不在同一事务中,一但插入失败,无法一起回滚) * @throws Exception */public void testInsertContact() throws Exception {ContentValues values = new ContentValues() ;//首先往主表增加一条空记录Uri rawContactUri = this.getContext().getContentResolver().insert(RawContacts.CONTENT_URI, values) ;//得到对应的主键IDlong rawContactId = ContentUris.parseId(rawContactUri) ;/** 开始往数据表中添加详细数据 **///姓名数据values.put(Data.RAW_CONTACT_ID, rawContactId) ;values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE) ; //内容类型为姓名类型values.put(StructuredName.DISPLAY_NAME, "firefly") ;this.getContext().getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values) ;//电话数据values.put(Data.RAW_CONTACT_ID, rawContactId) ;values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE) ; //内容类型 为手机号码类型values.put(Phone.NUMBER, "13800138000") ;values.put(Phone.TYPE, Phone.TYPE_HOME) ;this.getContext().getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values) ;//Email数据values.put(Data.RAW_CONTACT_ID, rawContactId) ;values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE) ; //内容类型 为手机号码类型values.put(Email.DATA, "[email protected]") ;values.put(Email.TYPE, Email.TYPE_HOME) ;this.getContext().getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values) ;}/** * Android提供的方法进行数据插入操作(在同一事务中,失败则一起回滚) * @throws Exception */public void testInsertContact2() throws Exception {/** 文档:reference/android/provider/ContactsContract.RawContacts.html **/ArrayList ops = new ArrayList() ;int rawContactInsertIndex = ops.size() ;//主表数据ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI).withValue(RawContacts.ACCOUNT_TYPE, null).withValue(RawContacts.ACCOUNT_NAME, null).build()) ;/** 文档位置:reference/android/provider/ContactsContract.Data.html **///姓名数据ops.add(ContentProviderOperation.newInsert(android.provider.ContactsContract.Data.CONTENT_URI).withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex) //如果是0,则表示后退引用前面插入的ID.withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE).withValue(StructuredName.GIVEN_NAME, "sina").build()) ;//电话数据ops.add(ContentProviderOperation.newInsert(android.provider.ContactsContract.Data.CONTENT_URI).withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex).withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE).withValue(Phone.NUMBER, "13800138001").withValue(Phone.TYPE, Phone.TYPE_HOME).withValue(Phone.LABEL, "home mobile").build()) ;//Email数据ops.add(ContentProviderOperation.newInsert(android.provider.ContactsContract.Data.CONTENT_URI).withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex).withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE).withValue(Email.DATA, "[email protected]").withValue(Email.TYPE, Email.TYPE_WORK).withValue(Email.LABEL, "home email").build()) ;ContentProviderResult[] results = this.getContext().getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops) ;for(ContentProviderResult result : results){Log.i(TAG, result.uri.toString()) ;}}}


 其他update、delete操作参见文档示例。

 

对通讯录进行读写操作需要在项目功能清单中配置相关权限:


 

更多相关文章

  1. Android 中的Intent在两个Acitvity传递数据示例
  2. 数据库判断是否为某一个值时sql
  3. Android学习--动态向SPinner控件中添加数据
  4. android简单登陆和注册功能实现+SQLite数据库学习
  5. Android数据库升级解决方案
  6. Android中SQLite数据库中query或者rawquery查询失败闪退问题
  7. Android中SQLite数据库操作(2)——使用SQLiteDatabase提供的方法操
  8. Android使用HttpURLConnection请求网络返回JSON数据并解析
  9. 【Android】数据库处理

随机推荐

  1. IDEA2019.2版本最新破解到2089年,亲测可用
  2. Composer常用指令、安装组件、自动加载器
  3. 30个Linux Shell脚本经典案例(下)
  4. 10 个Linux Awk文本处理经典案例
  5. Python 发送邮件各种姿势
  6. Kubernetes Dashboard v2.0.0 尝鲜
  7. Kubeadm 部署高可用 K8S 集群
  8. 解决docker服务默认网卡和宿主机网卡内网
  9. 一个简单的Java计时器项目,附源码
  10. RSA加密的填充方式