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添加联系人的更多相关文章

  1. Android向通讯录添加联系人的一般方法

    Android向通讯录添加联系人的一般方法 以一个简单的例子加以说明,记得需要相应的权限: 测试代码,关键的内容就在add函数里面. package zhangphil.demo; import an ...

  2. Android 利用内容提供者添加联系人的操作

    上文中<Android 获取系统的联系人>主要介绍了怎样获取系统联系人并实战了一下,本文将介绍如何添加一条联系人信息 添加联系人 1. 添加raw_contacts表,添加一条联系人的id ...

  3. Android 异步开发之 AsyncQueryHandler 批量添加联系人

    AsyncQueryHandler: 官方解释是一个异步帮助类(A helper class to help make handling asynchronous ContentResolver qu ...

  4. 黎活明8天快速掌握android视频教程--22_访问通信录中的联系人和添加联系人

    Android系统中联系人的通讯录的contentProvide是一个单独的apk,显示在界面的contact也是一个独立的apk,联系人apk通过contentProvide访问底层的数据库. 现在 ...

  5. Android 调用系统联系人界面的添加联系人,添加已有联系人,编辑和修改。

    一.添加联系人 Intent addIntent = new Intent(Intent.ACTION_INSERT,Uri.withAppendedPath(Uri.parse("cont ...

  6. Android 向系统添加一个联系人信息contact

    private void writeContacts() { Uri rawContacts = Uri.parse("content://com.android.contacts/raw_ ...

  7. android——利用SharedPreference做引导界面

    很久以前就接触过sharedPreference这个android中的存储介质.但是一直没有实际使用过,今天在看之前做的“民用机型大全”的app时,突然想到可以使用sharedPreference类来 ...

  8. Android 获取系统的联系人

    本文主要介绍android中怎样获取系统的联系人数据 首先打开模拟器 点击联系人图标按钮 说明系统联系人数据库是空的,打开File explorer,找到data/data下面的文件夹: 将conta ...

  9. 使用ContentProvider管理联系人------添加联系人

    add.setOnClickListener(new OnClickListener() { @Override public void onClick(View v) { // 获取程序界面中的三个 ...

随机推荐

  1. 使用SurfaceView

    一.新建一个工程“LearnSurfaceView” 二.新建一个类“MySurfaceView” public class MySurfaceView extends SurfaceView imp ...

  2. MyBatis——实现关联表查询

    原文:http://www.cnblogs.com/xdp-gacl/p/4264440.html 一.一对一关联 1.1.提出需求 根据班级id查询班级信息(带老师的信息) 1.2.创建表和数据 创 ...

  3. Hbase之获取数据

    import org.apache.hadoop.hbase.TableName; import org.apache.hadoop.hbase.client.*; import org.apache ...

  4. Django缓存优化之redis

    Redis 概述 Redis 是一个开源的Inmemory key-value 存储系统,性能高,很大程度上补偿了 memcached 的不足.支持多种存储类型,包括 string, list, se ...

  5. Java常见错误

    1.NullPointerExceptin 空指针异常 a.引用没有初始化就使用 b.引用置空了,仍然被使用 2.IndexOutofBoundsException 下标越界 a.数组下标小于0 或者 ...

  6. 常用的MYSQL 命令

    例1:建立一个名为xhkdb的数据库   mysql> create database xhkdb; 例2:显示数据库 命令:show databases (注意:最后有个s)mysql> ...

  7. aspcms网站访问出现3706错误, 错误描述:未找到提供程序。该程序可能未正确安装,解决的方法。

       

  8. 有关mipmaps

    Mipmaps的作用是什么,仅仅是为了使屏幕三角形和纹理三角形的差异变小?有没有以空间换时间的理念? Mipmaps在生成一系列小的纹理样本时, 是如何从原始纹理采样的?即如何生成这些小的纹理样本.

  9. 【CITE】5个最优秀的Java和C#代码转换工具

    毋庸置疑,Java是一门最受欢迎而且使用最广泛的编程语言,目前有超过9百万的Java开发者从事web服务的开发,Java以“编写一次,可在任何地方运行”而著称,同时这也是其大受欢迎的主要原因. 和Ja ...

  10. svg矢量图绘制以及转换为Android可用的VectorDrawable资源

    项目需要 要在快速设置面板里显示一个VoWiFi图标(为了能够区分出来图形,我把透明的背景填充为黑色了) 由于普通图片放大后容易失真,这里我们最好用矢量图(SVG(Scalable Vector Gr ...