电话联系人的读取

一、概述

使用内容提供者读取电话联系人是安卓开发中很常见的动作。像手机杀毒软件、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();
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值