一、概述
使用内容提供者读取电话联系人是安卓开发中很常见的动作。像手机杀毒软件、QQ、手机备份助手,都会去拿手机中的电话联系人和短信。其中,要Android中导出联系人db,contacts2.db结构如下:
contacts2.db分为普通db表和view视图表,view表是多表联合后的。一般我们用联系人,主要只用三张表,如下:
二、读取联系人
/**
* 这里面封装的是得到联系人ContactsInfo的工具类,传入一个上下文,用内容观察者搞定
*
* */
public static List<ContactsInfo> getAllContacts(Context context) {
List<ContactsInfo> list = new ArrayList<ContactsInfo>();
// 1.得到内容解析器
ContentResolver resolver = context.getContentResolver();
// 2.搞定URI
Uri cantcacturi = Uri
.parse("content://com.android.contacts/raw_contacts");
Uri datauri = Uri.parse("content://com.android.contacts/data");
// 3.先拿到有多少个联系人
Cursor cursor = resolver.query(cantcacturi,
new String[] { "contact_id" }, null, null, null);
while (cursor.moveToNext()) {
String id = cursor.getString(0);
if(id==null){
continue;
}
// 4.再拿到每一个联系人对应的数据
Cursor cursor2 = resolver.query(datauri, new String[] { "data1",
"mimetype" }, "raw_contact_id=?", new String[] { id },
null);
ContactsInfo contactsInfo = new ContactsInfo();
while (cursor2.moveToNext()) {
String data = cursor2.getString(0);
String type = cursor2.getString(1);
if("vnd.android.cursor.item/name".equals(type)){
contactsInfo.setName(data);
}else if("vnd.android.cursor.item/email_v2".equals(type)){
contactsInfo.setEmail(data);
}else if("vnd.android.cursor.item/phone_v2".equals(type)){
contactsInfo.setPhone(data);
}
Log.i("sky", "id===" + id + " type==" + type + " data==="
+ data);
}
cursor2.close();
list.add(contactsInfo);
}
return list;
}
三、添加并写入联系人
String path = "/mnt/sdcard/contacts.xml";
List<ContactsInfo> contactList = null;
//1.下面一pull解析,没什么好看的。
try {
XmlPullParser parser = Xml.newPullParser();
FileInputStream is = new FileInputStream(path);
parser.setInput(is, "utf-8");
int eventType = parser.getEventType();
ContactsInfo contact = null;
while(eventType != XmlPullParser.END_DOCUMENT) {
String tagName = parser.getName();
switch (eventType) {
case XmlPullParser.START_TAG:
if("contacts".equals(tagName)) {
contactList = new ArrayList<ContactsInfo>();
} else if("contact".equals(tagName)) {
contact = new ContactsInfo();
} else if("name".equals(tagName)) {
contact.setName(parser.nextText());
} else if("email".equals(tagName)) {
contact.setEmail(parser.nextText());
} else if("phone".equals(tagName)) {
contact.setPhone(parser.nextText());
}
break;
case XmlPullParser.END_TAG:
if("contact".equals(tagName)) {
contactList.add(contact);
contact = null;
}
break;
default:
break;
}
eventType = parser.next();
}
} catch ( Exception e) {
e.printStackTrace();
}
//2.下面是把集合中的联系人一个个存在进去
for (ContactsInfo contact : contactList) {
// 声明了查询raw_contacts这张表
Uri contactUri = Uri
.parse("content://com.android.contacts/raw_contacts");
// 指定查询的是data表
Uri dataUri = Uri.parse("content://com.android.contacts/data");
ContentResolver resolver = getContentResolver();
Cursor cursor = resolver.query(contactUri, new String[]{"_id"}, null, null, "_id DESC");
int id = 1 ;
if(cursor.moveToFirst()){
id = cursor.getInt(0)+1;
}
cursor.close();
ContentValues values = new ContentValues();
values.put("contact_id", id);
//往raw_contacts表里面先插入一条记录,
resolver.insert(contactUri, values);
//往data表里面添加数据
ContentValues nameVal = new ContentValues();
nameVal.put("data1", contact.getName());
nameVal.put("mimetype", "vnd.android.cursor.item/name");
nameVal.put("raw_contact_id", id);
resolver.insert(dataUri, nameVal);
//往data表里面添加数据
ContentValues phoneVal = new ContentValues();
phoneVal.put("data1", contact.getPhone());
phoneVal.put("mimetype", "vnd.android.cursor.item/phone_v2");
phoneVal.put("raw_contact_id", id);
resolver.insert(dataUri, phoneVal);
//往data表里面添加数据
ContentValues emailVal = new ContentValues();
emailVal.put("data1", contact.getEmail());
emailVal.put("mimetype", "vnd.android.cursor.item/email_v2");
emailVal.put("raw_contact_id", id);
resolver.insert(dataUri, emailVal);
}
Toast.makeText(this, "还原联系人成功", 0).show();