1. 示例代码

需要的读写联系人的权限

<uses-permission android:name="android.permission.WRITE_CONTACTS"/>
<uses-permission android:name="android.permission.READ_CONTACTS"/>

读联系人代码

public void click(View view) {
ContentResolver resolver = getContentResolver();
// raw_contact 表的uri
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
// data 表的uri
Uri dataUri = Uri.parse("content://com.android.contacts/data");
Cursor cursor = resolver.query(uri, new String[] { "contact_id" },
null, null, null);
while (cursor.moveToNext()) {
String id = cursor.getString(0);
//系统删除联系人的时候不会删除全部db中的信息,只是将id置为 null
if (id != null) {
Cursor dataCursor = resolver.query(dataUri, new String[] {
"data1", "mimetype" }, "raw_contact_id=?",
new String[] { id }, null);
while (dataCursor.moveToNext()) {
String data = dataCursor.getString(0);
String mimetype = dataCursor.getString(1);
System.out.println("data:" + data);
System.out.println("mimetype:" + mimetype); }
dataCursor.close();
System.out.println("----------");
}
}
cursor.close();
}

写联系人代码

public void click(View view) {
String name = et_name.getText().toString().trim();
String phone = et_phone.getText().toString().trim();
String email = et_email.getText().toString().trim(); if (TextUtils.isEmpty(name) || TextUtils.isEmpty(phone)) {
Toast.makeText(this, "姓名或者电话不能为空", 1).show();
return;
}
// 把数据写入到系统的联系人.
ContentResolver resolver = this.getContentResolver();
// ----------在raw_contant表中添加一条新的id---------------
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");
// 插入联系人 必须要知道 新的联系人的id
Cursor cursor = resolver.query(uri, new String[] { "contact_id" },
null, null, "contact_id");
int contact_id;
if (cursor.moveToLast()) {
contact_id = cursor.getInt(0) + 1; // 数据库里面有数据 最后一条联系人的id + 1
} else {// 原先数据库是空的 从第一个联系人开始
contact_id = 1;
}
ContentValues values = new ContentValues();
values.put("contact_id", contact_id);
resolver.insert(uri, values);
// ----------------------------- // ------------在data表里面 添加id对应的数据-------------
Uri dataUri = Uri.parse("content://com.android.contacts/data"); // 插入姓名
ContentValues nameValue = new ContentValues();
nameValue.put("data1", name);
nameValue.put("raw_contact_id", contact_id);
nameValue.put("mimetype", "vnd.android.cursor.item/name");
resolver.insert(dataUri, nameValue); // 插入电话
ContentValues phoneValue = new ContentValues();
phoneValue.put("data1", phone);
phoneValue.put("raw_contact_id", contact_id);
phoneValue.put("mimetype", "vnd.android.cursor.item/phone_v2");
resolver.insert(dataUri, phoneValue); // 插入邮箱
if (!TextUtils.isEmpty(email)) {
ContentValues emailValue = new ContentValues();
emailValue.put("data1", email);
emailValue.put("raw_contact_id", contact_id);
emailValue.put("mimetype", "vnd.android.cursor.item/email_v2");
resolver.insert(dataUri, emailValue);
} Toast.makeText(this, "插入数据成功", 0).show();
}

Android -- ContentProvider, 读取和保存系统 联系人的更多相关文章

  1. Android(java)学习笔记249:ContentProvider使用之获得系统联系人信息01

    1.系统联系人的数据库(3张最重要的表) (1)raw_contacts  联系人表        保存联系人的id   contact_id (2)data 数据表       保存联系人的数据 ( ...

  2. Android(java)学习笔记193:ContentProvider使用之获得系统联系人信息01

    1.系统联系人的数据库(3张最重要的表) (1)raw_contacts  联系人表        保存联系人的id   contact_id (2)data 数据表       保存联系人的数据 ( ...

  3. Android(java)学习笔记250:ContentProvider使用之获得系统联系人信息02(掌握)

    1.重要: 系统删除一个联系人,默认情况下并不是把这个联系人直接删除掉了,只是做了一个标记,标记为被删除. 2.前面一讲说过了如何获取系统联系人信息(通过ContentProvider),获取联系人信 ...

  4. Android(java)学习笔记194:ContentProvider使用之获得系统联系人信息02(掌握)

    1.重要: 系统删除一个联系人,默认情况下并不是把这个联系人直接删除掉了,只是做了一个标记,标记为被删除. 2.前面一讲说过了如何获取系统联系人信息(通过ContentProvider),获取联系人信 ...

  5. Android初级教程获取手机系统联系人信息

    在手机内部,对联系人信息存在对应的数据库.我们创建的而联系人信息都存在这张表中.如下是对数据库的截图,我已经对表和应该注意的地方做了红笔标注: 好了,现在可以根据数据库里面的数据来写代码了. 代码如下 ...

  6. android: 通过内容提供器读取系统联系人

    读取系统联系人 由于我们之前一直使用的都是模拟器,电话簿里面并没有联系人存在,所以现在需要自 己手动添加几个,以便稍后进行读取.打开电话簿程序,界面如图 7.1 所示. 图   7.1 可以看到,目前 ...

  7. Android 开发 ContentProvider 获取歌曲列表和联系人的样例

    ContentProvider(内容提供者)是Android中的四大组件之中的一个. 主要用于对外共享数据.也就是通过ContentProvider把应用中的数据共享给其它应用訪问.其它应用能够通过C ...

  8. android 获取系统联系人 完全解析

    一.代码 1.ContactsEngine.java import java.util.ArrayList; import java.util.HashMap; import java.util.Li ...

  9. Android系统联系人全特效实现(上),分组导航和挤压动画

    记得在我刚接触Android的时候对系统联系人中的特效很感兴趣,它会根据手机中联系人姓氏的首字母进行分组,并在界面的最顶端始终显示一个当前的分组.如下图所示: 最让我感兴趣的是,当后一个分组和前一个分 ...

随机推荐

  1. Girls' research---hdu3294(回文子串manacher)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3294 给出一个字符串和加密的字符规律 例如 c abcba c代表把串中的c改成a,d改成b... b ...

  2. Android中TextView设置最大长度,超出显示省略号

    今天在项目中碰到一个问题,在一个页面的顶部的标题栏显示公司的名字,但由于公司名称较长,显示不开,影响美观.故在网上查阅资料,在此做个小的总结. TextView中有个ellipsize属性,作用是当文 ...

  3. Eclipse集成SVN

    安装Subversion1.82(SVN)插件 简介    :SVN是团队开发的代码管理工具,它使我们得以进行多人在同一平台之下的团队开发. 解决问题:Eclipse下的的SVN插件安装. 学到    ...

  4. 对比python的进程和线程:多线程是假的

    进程,是系统进行资源分配最小单位(拥有独立的内存单元).(python中多进程是真的) 线程,是操作系统最小的执行单位(共享内存资源),比进程还小.(python中多线程是假的,因为cpython解释 ...

  5. python web框架 django 添加环境变量

    C:\Users\Administrator.QH-20170325TNQR\AppData\Local\Programs\Python\Python36\Scripts把环境变量加上 可以在本地执行 ...

  6. ROC与AUC学习

    全文转自:https://www.cnblogs.com/gatherstars/p/6084696.html#commentform 这篇真的讲的清楚明白!要多复习!加深记忆! 1.概述 AUC(A ...

  7. 用tophat和cufflinks分析RNAseq数据[转载]

    转自:http://blog.sciencenet.cn/home.php?mod=space&uid=635619&do=blog&id=884213 //今天看到一篇非常好 ...

  8. 内存检查工具Valgrind

    官网介绍:http://www.valgrind.org/ Valgrind is an instrumentation framework for building dynamic analysis ...

  9. [React-Native]入门(Hello World)

    (1)需要一台Mac(OSX),这个是前提,建议还是入手一本啦. (2)在Mac上安装Xcode,建议Xcode 6.3以上版本 (3)安装node.js:https://nodejs.org/dow ...

  10. Maven打包部署

    Maven打Jar包 问题一 Eclipse突然SB告诉我类不存在还让我导包进来O__O "…,但是我明明有这个类.这是不要慌,通过在网上搜索得知:由于eclipse的编译是基于时间戳的判断 ...