Android利用ContentProviderOperation添加联系人
Android添加联系人有两种方式:
1. 直接调用插入语句,先插入一个空Item,得到一个id,然后给这个id对应的插入其他信息,如姓名,号码,邮件等;
2. 利用ContentProviderOperation, 在系统应用Phonebook中就是采用这种方式, 代码如下:
实现了插入姓名,号码以及头像。
     private boolean saveUpdatedPhoto(long rawContactId, File photoFile) {
         final Uri outputUri = Uri.withAppendedPath(ContentUris.withAppendedId(
                 RawContacts.CONTENT_URI, rawContactId),
                 RawContacts.DisplayPhoto.CONTENT_DIRECTORY);
         boolean result = false;
         try {
             final FileOutputStream outputStream = getContentResolver()
                     .openAssetFileDescriptor(outputUri, "rw")
                     .createOutputStream();
             try {
                 final FileInputStream inputStream = new FileInputStream(
                         photoFile);
                 try {
                     final byte[] buffer = new byte[16 * 1024];
                     int length;
                     int totalLength = 0;
                     while ((length = inputStream.read(buffer)) > 0) {
                         outputStream.write(buffer, 0, length);
                         totalLength += length;
                     }
                     result = true;
                 } finally {
                     inputStream.close();
                 }
             } finally {
                 outputStream.close();
                 photoFile.delete();
             }
         } catch (IOException e) {
             result = false;
         }
         return result;
     }
     public void addContact(String name, CharSequence phoneNumber1,
             CharSequence phoneNumber2, String email1, String email2, String im,
             String nickname) {
         final ArrayList<ContentProviderOperation> operationList = new ArrayList<ContentProviderOperation>();
         ContentProviderOperation.Builder builder = null;
         int rawContactIndex = 0;
         builder = ContentProviderOperation.newInsert(RawContacts.CONTENT_URI);
         builder.withValue(RawContacts.ACCOUNT_NAME, "Phone contacts");
         builder.withValue(RawContacts.ACCOUNT_TYPE,
                 "com.sonyericsson.localcontacts");
         builder.withValue(RawContacts.AGGREGATION_MODE,
                 RawContacts.AGGREGATION_MODE_DISABLED);
         operationList.add(builder.build());
         // Add name.
         builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
         builder.withValueBackReference(StructuredName.RAW_CONTACT_ID,
                 rawContactIndex);
         builder.withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
         builder.withValue(StructuredName.GIVEN_NAME, name);
         operationList.add(builder.build());
         // Add phone number.
         if (!TextUtils.isEmpty(phoneNumber1)) {
             builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
             builder.withValueBackReference(Phone.RAW_CONTACT_ID,
                     rawContactIndex);
             builder.withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
             builder.withValue(Phone.TYPE, Phone.TYPE_MOBILE);
             builder.withValue(Phone.NUMBER, phoneNumber1);
             builder.withValue(Data.IS_PRIMARY, 1);
             operationList.add(builder.build());
         }
         // Add phone number.
         if (!TextUtils.isEmpty(phoneNumber2)) {
             builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
             builder.withValueBackReference(Phone.RAW_CONTACT_ID,
                     rawContactIndex);
             builder.withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
             builder.withValue(Phone.TYPE, Phone.TYPE_HOME);
             builder.withValue(Phone.NUMBER, phoneNumber2);
             builder.withValue(Data.IS_PRIMARY, 0);
             operationList.add(builder.build());
         }
         // Add Email info.
         if (!TextUtils.isEmpty(email1)) {
             builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
             builder.withValueBackReference(Email.RAW_CONTACT_ID,
                     rawContactIndex);
             builder.withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
             builder.withValue(Email.TYPE, Email.TYPE_MOBILE);
             builder.withValue(Email.DATA, email1);
             operationList.add(builder.build());
         }
         if (!TextUtils.isEmpty(email2)) {
             builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
             builder.withValueBackReference(Email.RAW_CONTACT_ID,
                     rawContactIndex);
             builder.withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);
             builder.withValue(Email.TYPE, Email.TYPE_HOME);
             builder.withValue(Email.DATA, email2);
             operationList.add(builder.build());
         }
         // Add IM info.
         builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
         builder.withValueBackReference(Im.RAW_CONTACT_ID, rawContactIndex);
         builder.withValue(Data.MIMETYPE, Im.CONTENT_ITEM_TYPE);
         builder.withValue(Im.TYPE, Im.PROTOCOL_QQ);
         builder.withValue(Im.DATA, im);
         operationList.add(builder.build());
         // Add Nickname info.
         builder = ContentProviderOperation.newInsert(Data.CONTENT_URI);
         builder.withValueBackReference(Nickname.RAW_CONTACT_ID, rawContactIndex);
         builder.withValue(Data.MIMETYPE, Nickname.CONTENT_ITEM_TYPE);
         builder.withValue(Nickname.TYPE, Nickname.TYPE_INITIALS);
         builder.withValue(Nickname.DATA, nickname);
         operationList.add(builder.build());
         try {
             getContentResolver().applyBatch(ContactsContract.AUTHORITY,
                     operationList);
             // Get raw_contact_id
             Cursor cc = getContentResolver().query(RawContacts.CONTENT_URI,
                     null, "display_name=?", new String[] { name }, null);
             cc.moveToFirst();
             // Insert photo for the contact.
             saveUpdatedPhoto(cc.getLong(cc.getColumnIndex("_id")), new File(
                     "/sdcard/DCIM/Camera/ContactPhoto-IMG_19700104_013154.jpg"));
         } catch (RemoteException e) {
         } catch (OperationApplicationException e) {
         }
     }
基本思路是先插入除头像以外的其他信息,然后获得raw_contact_id,再给这个id插入头像,具体方法是saveUpdatedPhoto()。
Note:本人不太清楚能不能像插入姓名一样插入头像,所以才想出了这么一招,如果谁有更好的方法,不需要查询获得id就可以直接插入头像,共享一哈。
Android利用ContentProviderOperation添加联系人的更多相关文章
- Android向通讯录添加联系人的一般方法
		
Android向通讯录添加联系人的一般方法 以一个简单的例子加以说明,记得需要相应的权限: 测试代码,关键的内容就在add函数里面. package zhangphil.demo; import an ...
 - Android 利用内容提供者添加联系人的操作
		
上文中<Android 获取系统的联系人>主要介绍了怎样获取系统联系人并实战了一下,本文将介绍如何添加一条联系人信息 添加联系人 1. 添加raw_contacts表,添加一条联系人的id ...
 - Android 异步开发之 AsyncQueryHandler 批量添加联系人
		
AsyncQueryHandler: 官方解释是一个异步帮助类(A helper class to help make handling asynchronous ContentResolver qu ...
 - 黎活明8天快速掌握android视频教程--22_访问通信录中的联系人和添加联系人
		
Android系统中联系人的通讯录的contentProvide是一个单独的apk,显示在界面的contact也是一个独立的apk,联系人apk通过contentProvide访问底层的数据库. 现在 ...
 - Android 调用系统联系人界面的添加联系人,添加已有联系人,编辑和修改。
		
一.添加联系人 Intent addIntent = new Intent(Intent.ACTION_INSERT,Uri.withAppendedPath(Uri.parse("cont ...
 - Android 向系统添加一个联系人信息contact
		
private void writeContacts() { Uri rawContacts = Uri.parse("content://com.android.contacts/raw_ ...
 - android——利用SharedPreference做引导界面
		
很久以前就接触过sharedPreference这个android中的存储介质.但是一直没有实际使用过,今天在看之前做的“民用机型大全”的app时,突然想到可以使用sharedPreference类来 ...
 - Android 获取系统的联系人
		
本文主要介绍android中怎样获取系统的联系人数据 首先打开模拟器 点击联系人图标按钮 说明系统联系人数据库是空的,打开File explorer,找到data/data下面的文件夹: 将conta ...
 - 使用ContentProvider管理联系人------添加联系人
		
add.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 获取程序界面中的三个 ...
 
随机推荐
- ora-01033:oracle initialization or shutdown in progress 解决方法
			
今天研究Oracle遇到了这个问题ora-01033:oracle initialization or shutdown in progress,经过分析研究终于解决了,写下来纪念一下.我的库是ora ...
 - NTFS reparse point
			
https://en.wikipedia.org/wiki/NTFS_reparse_point NTFS HARD link: since Windows NT4: files on the sam ...
 - Java编程思想学习笔记_4(异常机制,容器)
			
一.finally语句注意的细节: 当涉及到break和continue语句的时候,finally字句也会得到执行. public class Test7 { public static void m ...
 - Java用通配符 获得泛型的协变和逆变
			
Java对应泛型的协变和逆变
 - NYOJ 298 点的变换
			
题目链接:298 点的变换 这题放在矩阵快速幂里,我一开始想不透它是怎么和矩阵搭上边的,然后写了个暴力的果然超时,上网看了题解后,发现竟然能够构造一些精巧的矩阵来处理,不得不说实在太强大了! http ...
 - 移动端 meta
			
摘自http://www.cnblogs.com/shxydx/articles/2856882.html 控制显示区域各种属性: <meta content="width=dev ...
 - Android布局_布局概述和LinearLayout布局
			
一.布局概述: 布局为UI提供了一个可视化的结构,比如对于一个activity或者app widget的UI,你可以用两种方式声明布局: 在XML中声明UI元素 在运行时实例化布局元素(在java代码 ...
 - python 脚本传递参数
			
python查找指定字符 #!/usr/bin/env python import sys import re f = open("log.txt", "rb" ...
 - $.each 与$().each()
			
在jquery中,遍历对象和数组,经常会用到$().each和$.each(),两个方法.两个方法是有区别的,从而这两个方法在针对不同的操作上,显示了各自的特点. $().each,对于这个方法,在d ...
 - word-break:break-all和word-wrap:break-word的区别
			
了解word-break属性 /* 关键字值 */ word-break: normal; word-break: break-all; word-break: keep-all; /* 全局值 */ ...