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. 哈密顿绕行世界问题---hdu2181(全排列问题)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2181 题意很容易理解,dfs就可以了 #include <iostream> #inclu ...

  2. lua相关库安装常见问题

    一.先安装lua brew install lua 我本机的安装路径为:/usr/local/Cellar/lua/5.3.4_2 二.安装luarocks 下载luarocks的安装包: http: ...

  3. 100个常用的linux命令(转)

    原文:http://blogread.cn/it/article/6368?f=wb 1,echo “aa” > test.txt 和 echo “bb” >> test.txt / ...

  4. rest_framework 之版本控制

    一 作用 用于版本的控制 二 内置的版本控制类 from rest_framework.versioning import QueryParameterVersioning,AcceptHeaderV ...

  5. neutron ml2

    版权声明:本文为博主原创文章,未经博主同意不得转载. https://blog.csdn.net/zhoumingbo532/article/details/27964675 在介绍ml2之前,先介绍 ...

  6. mutex_lock

    多核处理器下,会存在多个进程处于内核态的情况,而在内核态下,进程是可以访问所有内核数据的,因此要对共享数据进行保护,即互斥处理. mutex_lock(struct mutex *lock)和mute ...

  7. 浅析Spring AOP

    在正常的业务流程中,往往存在着一些业务逻辑,例如安全审计.日志管理,它们存在于每一个业务中,然而却和实际的业务逻辑没有太强的关联关系. 图1 这些逻辑我们称为横切逻辑.如果把横切的逻辑代码写在业务代码 ...

  8. 存储器系列,L1缓存,L2缓存,内存(RAM),EEPROM和闪存,CMOS与BIOS电池

    因为各级存储硬件的参数和性能不同所以在计算机硬件当中分为以下几种: 由此可见顶级空间小但处理速度最快,下层容量大但处理速度时间较长. 存储器系统采用分层结构,顶层的存储器速度较高,容量较小,与底层的存 ...

  9. exec-maven-plugin配置及使用

    背景: 如果你想在项maven生命周期内,运行一段java代码,或者一段独立的程序,或者说我们所指的预执行,初始化某些值,生成某些不能预先生成的文件.那么这样我们就可以使用exec-maven-plu ...

  10. Ubuntu16.04中用et对jmeter生成的数据统计成图表

    在Ubuntu系统中,用ctrl+Alt+t 打开终端: 输入et,即打开wps: 整理需要形成图表的数据,如: 用excel生成图表,如下: 表得出的性能图表,方法: 1.工具栏中选择插入——二维折 ...