完整联系人信息读取和插入

先说下bean

public class ContactBean {// 存放联系人的bean 信息

private String displayName;// 联系人的名字

private List<String> emails ;// 联系人email 的集合

private List<String> phones;// 电话的集合!

}


操作类!ContactUtils



以下有 获取的方法,和添加的方法我都测试过了,没任何问题!

你用的时候, 整个考过去, 改改就行了!



package com.example.testcontentprovider.utils;

import java.util.ArrayList;

import java.util.List;

import android.content.ContentProviderOperation;

import android.content.ContentProviderResult;

import android.content.ContentResolver;

import android.content.ContentUris;

import android.content.ContentValues;

import android.content.Context;

import android.content.OperationApplicationException;

import android.database.Cursor;

import android.net.Uri;

import android.os.RemoteException;

import android.provider.ContactsContract;

import android.util.Log;

import com.example.testcontentprovider.bean.ContactBean;

public class ContactUtils {

//[content://com.android.contacts/contacts]

private static final Uri CONTACTS_URI = ContactsContract.Contacts.CONTENT_URI;

//[content://com.android.contacts/data/phones]

private static final Uri PHONES_URI = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;

//[content://com.android.contacts/data/emails]

private static final Uri EMAIL_URI = ContactsContract.CommonDataKinds.Email.CONTENT_URI;

private static final String _ID = ContactsContract.Contacts._ID;

private static final String DISPLAY_NAME = ContactsContract.Contacts.DISPLAY_NAME;

private static final String HAS_PHONE_NUMBER = ContactsContract.Contacts.HAS_PHONE_NUMBER;

private static final String CONTACT_ID = ContactsContract.Data.CONTACT_ID;

private static final String PHONE_NUMBER = ContactsContract.CommonDataKinds.Phone.NUMBER;

private static final String PHONE_TYPE = ContactsContract.CommonDataKinds.Phone.TYPE;

private static final String EMAIL_DATA = ContactsContract.CommonDataKinds.Email.DATA;

private static final String EMAIL_TYPE = ContactsContract.CommonDataKinds.Email.TYPE;

//[content://com.android.contacts/raw_contacts]

private static final Uri RAW_CONTACTS_URI = ContactsContract.RawContacts.CONTENT_URI;

//[content://com.android.contacts/data]

private static final Uri DATA_URI = ContactsContract.Data.CONTENT_URI;

private static final String ACCOUNT_TYPE = ContactsContract.RawContacts.ACCOUNT_TYPE;

private static final String ACCOUNT_NAME = ContactsContract.RawContacts.ACCOUNT_NAME;

private static final String RAW_CONTACT_ID = ContactsContract.Data.RAW_CONTACT_ID;

private static final String MIMETYPE = ContactsContract.Data.MIMETYPE;

private static final String NAME_ITEM_TYPE = ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE;

private static final String PHONE_ITEM_TYPE = ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE;

private static final int PHONE_TYPE_HOME = ContactsContract.CommonDataKinds.Phone.TYPE_HOME;

private static final int PHONE_TYPE_MOBILE = ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE;

private static final String EMAIL_ITEM_TYPE = ContactsContract.CommonDataKinds.Email.CONTENT_ITEM_TYPE;

private static final int EMAIL_TYPE_HOME = ContactsContract.CommonDataKinds.Email.TYPE_HOME;

private static final int EMAIL_TYPE_WORK = ContactsContract.CommonDataKinds.Email.TYPE_WORK;

private static final String AUTHORITY = ContactsContract.AUTHORITY;

public static List getContacts(Context context){

// 存放所有联系人信息的集合!

List contactBeans = new ArrayList();

ContentResolver resolver =context.getContentResolver();

// 查找联系人表!

Cursor c = resolver.query(CONTACTS_URI, null, null, null, null);

// 开始遍历游标!

while (c.moveToNext()) {

// 存放单个联系人的集合!

ContactBean contactBean = new ContactBean();

// 得到联系人的_ID

int _id = c.getInt(c.getColumnIndex(_ID));

// 得到联系人的名字!

String displayName = c.getString(c.getColumnIndex(DISPLAY_NAME));

// 设置到contactBean 中!

contactBean.setDisplayName(displayName);

//Log.i(TAG, displayName);

ArrayList phones = new ArrayList();

ArrayList emails = new ArrayList();

// 根据联系人id 去查找对应的数据! 一下是查询条件!

String selection = CONTACT_ID + "=" + _id;  //the 'where' clause

//获取手机号

// 获取电话号码的数量! 如果有肯定就>0. 如果没有就是0 就不需要去获取了!

int hasPhoneNumber = c.getInt(c.getColumnIndex(HAS_PHONE_NUMBER));

if (hasPhoneNumber > 0) {

// 有电话号码,就去电话号码那表中去获取数据就行了!

// PHONES_URI 代表电话号码那张表!一对多的关系, 一个联系人有多个电话号码, 多个电话能属于一个人, 双向

// 关联都成立,才是硬道理!

// 所以以下Phc 中 可以是个集合, 而且我敢肯定每条记录的区别,用phoneType 字段来区分开来!

Cursor  phc = resolver.query(PHONES_URI, null, selection, null, null);

while (phc.moveToNext()) {

// 每遍历一次就,将类型和电话号码放到phones集合中!

String phoneNumber = phc.getString(phc.getColumnIndex(PHONE_NUMBER));

int phoneType = phc.getInt(phc.getColumnIndex(PHONE_TYPE));

phones.add(getPhoneTypeNameById(phoneType) + " : " + phoneNumber);

}

// 别忘记了把结合放到contactBean中!

contactBean.setNumbers(phones);// 搞定!

phc.close();

}

//Log.i(TAG, "phones: " + phones);

//获取邮箱

Cursor emc = resolver.query(EMAIL_URI,null, selection, null, null);

while (emc.moveToNext()) {

String emailData = emc.getString(emc.getColumnIndex(EMAIL_DATA));

int emailType = emc.getInt(emc.getColumnIndex(EMAIL_TYPE));

emails.add(getEmailTypeNameById(emailType) + " : " + emailData);

}

// 别忘记了把结合放到contactBean中!

contactBean.setEmail(emails);

emc.close();

//Log.i(TAG, "emails: " + emails);

// 最后把 contactBean 放到它的结合中就行了!

contactBeans.add(contactBean);

}

c.close();

return contactBeans;// 返回联系人信息!

}

private static  String getPhoneTypeNameById(int typeId) {

switch (typeId) {

case ContactsContract.CommonDataKinds.Phone.TYPE_HOME: return "home";

case ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE: return "mobile";

case ContactsContract.CommonDataKinds.Phone.TYPE_WORK: return "work";

default: return "none";

}

}

private static String getEmailTypeNameById(int typeId) {

switch (typeId) {

case ContactsContract.CommonDataKinds.Email.TYPE_HOME: return "home";

case ContactsContract.CommonDataKinds.Email.TYPE_WORK: return "work";

case ContactsContract.CommonDataKinds.Email.TYPE_OTHER: return "other";

default: return "none";

}

}

public static    void writeContacts(Context context,String displayName,String phone,String email,String homePhone) throws RemoteException, OperationApplicationException{

/* 往 raw_contacts 中添加数据,并获取添加的id号*/

Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");

ContentResolver resolver = context.getContentResolver();

ContentValues values = new ContentValues();

long contactId = ContentUris.parseId(resolver.insert(uri, values));

/* 往 data 中添加数据(要根据前面获取的id号) */

// 添加姓名

uri = Uri.parse("content://com.android.contacts/data");

values.put("raw_contact_id", contactId);

values.put("mimetype", "vnd.android.cursor.item/name");

values.put("data2", displayName);

resolver.insert(uri, values);

// 添加电话

values.clear();

values.put("raw_contact_id", contactId);

values.put("mimetype", "vnd.android.cursor.item/phone_v2");

values.put("data2", "2");

values.put("data1", phone);

resolver.insert(uri, values);

// 添加家庭电话号码,其它的操作, 比如家庭email 等, 都类似,就是

// data2数值不同罢了!

values.clear();

values.put("raw_contact_id", contactId);

values.put("mimetype", "vnd.android.cursor.item/phone_v2");

values.put("data2", "1");

values.put("data1", homePhone);

resolver.insert(uri, values);

// 添加Email

values.clear();

values.put("raw_contact_id", contactId);

values.put("mimetype", "vnd.android.cursor.item/email_v2");

values.put("data2", "2");

values.put("data1", email);

resolver.insert(uri, values);

}

}

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 194,457评论 5 459
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 81,837评论 2 371
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 141,696评论 0 319
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 52,183评论 1 263
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 61,057评论 4 355
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 46,105评论 1 272
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 36,520评论 3 381
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 35,211评论 0 253
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 39,482评论 1 290
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 34,574评论 2 309
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 36,353评论 1 326
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 32,213评论 3 312
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 37,576评论 3 298
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 28,897评论 0 17
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 30,174评论 1 250
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 41,489评论 2 341
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 40,683评论 2 335

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,497评论 18 139
  • ¥开启¥ 【iAPP实现进入界面执行逐一显】 〖2017-08-25 15:22:14〗 《//首先开一个线程,因...
    小菜c阅读 6,327评论 0 17
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 171,050评论 25 707
  • 临近期末,目前在进行Android课程设计,对于我这个压根不怎么学习的孩子来说,刚开始的完全是懵逼的,后来花两天时...
    站在冰箱上的姑娘阅读 23,759评论 5 41
  • 这几天《悟空传》这部电影传火,我忙里偷闲,将《悟空传》的原书读了一遍。 如果失去是苦,你还怕不怕付出? 如果坠落是...
    依韵宵音阅读 548评论 1 1