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. HDFS 手写mapreduce单词计数框架

    一.数据处理类 package com.css.hdfs; import java.io.BufferedReader; import java.io.IOException; import java ...

  2. JAVA—List集合总结

    List接口总结: List接口是Collection接口的子接口,从其名称可以看出,是一个元素有序(并不是按大小排序,具有顺序索引,类似于数组),默认按照元素的添加顺序设置元素的索引,List和Se ...

  3. MySQL优化(二):SQL优化

    一.SQL优化 1.优化SQL一般步骤 1.1 查看SQL执行频率 SHOW STATUS LIKE 'Com_%'; Com_select:执行SELECT操作的次数,一次查询累加1.其他类似 以下 ...

  4. 理解Global interpreter lock

      Global interpreter lock (GIL) is a mechanism used in computer language interpreters to synchronize ...

  5. MySQL中的表级锁

    数据的锁主要用来保证数据的一致性,数据库的锁从锁定的粒度上可以分为表级锁,行级锁和页级锁. MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制,比如MyISAM和MEMORY存 ...

  6. retry 使用

    retry是用来实现重试的 from retry import retry @retry(tries=5, delay=2) def do_something(): xxx do_something( ...

  7. 八、网页版消息推送SDK-WebSockets

    介绍 由于项目组需求.最近在研究消息推送服务平台.结合业务和使用场景分析最终选择的是 Mosquitto 消息服务器. Mosquitto 服务器的安装.配置.集群搭建 我就不在这多说了.有兴趣的可以 ...

  8. SDUT3141:Count(哈希)好题

    题目:传送门 题目描述 You are given an integer array s[] and are asked to count how many positions a, b, c and ...

  9. 使用Spring注解获取配置文件信息

    需要加载的配置文件内容(resource.properties): #FTP相关配置 #FTP的IP地址 FTP_ADDRESS=192.168.1.121 FTP_PORT=21 FTP_USERN ...

  10. 注释的HALCON的程序

    *关闭窗口 dev_close_window () dev_close_window () *打开指定大小.颜色背景的窗口 dev_open_window (0, 0, 768/2, 576/2, ' ...