手机通讯录备份代码实现一

import java.io.BufferedReader;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.List;import a_vcard.android.provider.Contacts;
import a_vcard.android.syncml.pim.VDataBuilder;
import a_vcard.android.syncml.pim.VNode;
import a_vcard.android.syncml.pim.vcard.ContactStruct;
import a_vcard.android.syncml.pim.vcard.ContactStruct.ContactMethod;
import a_vcard.android.syncml.pim.vcard.ContactStruct.PhoneData;
import a_vcard.android.syncml.pim.vcard.VCardComposer;
import a_vcard.android.syncml.pim.vcard.VCardException;
import a_vcard.android.syncml.pim.vcard.VCardParser;
import android.app.Activity;
import android.content.ContentUris;
import android.content.ContentValues;
import android.database.Cursor;
import android.net.Uri;
import android.os.Environment;
import android.provider.ContactsContract;
import android.provider.ContactsContract.CommonDataKinds.Email;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.CommonDataKinds.StructuredName;
import android.provider.ContactsContract.RawContacts;
import android.provider.ContactsContract.RawContacts.Data;
import android.widget.Toast;public class ContactInfo {/** MUST exist */private String name; // 姓名/** 联系人电话信息 */public static class PhoneInfo {/** 联系电话类型 */public int type;/** 联系电话 */public String number;}/** 联系人邮箱信息 */public static class EmailInfo {/** 邮箱类型 */public int type;/** 邮箱 */public String email;}private List<PhoneInfo> phoneList = new ArrayList<PhoneInfo>(); // 联系号码private List<EmailInfo> email = new ArrayList<EmailInfo>(); // Email/*** 构造联系人信息* * @param name*            联系人姓名*/public ContactInfo(String name) {this.name = name;}/** 姓名 */public String getName() {return name;}/** 姓名 */public ContactInfo setName(String name) {this.name = name;return this;}/** 联系电话信息 */public List<PhoneInfo> getPhoneList() {return phoneList;}/** 联系电话信息 */public ContactInfo setPhoneList(List<PhoneInfo> phoneList) {this.phoneList = phoneList;return this;}/** 邮箱信息 */public List<EmailInfo> getEmail() {return email;}/** 邮箱信息 */public ContactInfo setEmail(List<EmailInfo> email) {this.email = email;return this;}@Overridepublic String toString() {return "{name: " + name + ", number: " + phoneList + ", email: " + email + "}";}/*** 联系人 备份/还原操作* * @author LW* */public static class ContactHandler {private static ContactHandler instance_ = new ContactHandler();/** 获取实例 */public static ContactHandler getInstance() {return instance_;}/*** 获取联系人指定信息* * @param projection*            指定要获取的列数组, 获取全部列则设置为null* @return* @throws Exception*/public Cursor queryContact(Activity context, String[] projection) {// 获取联系人的所需信息Cursor cur = context.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI,projection, null, null, null);return cur;}/*** 获取联系人信息* * @param context* @return*/public List<ContactInfo> getContactInfo(Activity context) {List<ContactInfo> infoList = new ArrayList<ContactInfo>();String[] selection = new String[] { Phone._ID, Phone.DISPLAY_NAME, Phone.NUMBER,Phone.PHOTO_URI, Phone.CONTACT_ID, Phone.HAS_PHONE_NUMBER };Cursor cur = context.getContentResolver().query(Phone.CONTENT_URI, selection, null,null, null);if (cur.moveToFirst()) {do {// 获取联系人id号String id = cur.getString(cur.getColumnIndex(Phone.CONTACT_ID));// 获取联系人姓名String displayName = cur.getString(cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));ContactInfo info = new ContactInfo(displayName);// 初始化联系人信息int columnindex = cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER);// 查看联系人有多少电话号码, 如果没有返回0int phoneCount = cur.getInt(columnindex);if (phoneCount > 0) {Cursor phonesCursor = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,ContactsContract.CommonDataKinds.Phone.CONTACT_ID + "=" + id, null,null);if (phonesCursor.moveToFirst()) {List<ContactInfo.PhoneInfo> phoneNumberList = new ArrayList<ContactInfo.PhoneInfo>();do {// 遍历所有电话号码String phoneNumber = phonesCursor.getString(phonesCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));// 对应的联系人类型int type = phonesCursor.getInt(phonesCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));// 初始化联系人电话信息ContactInfo.PhoneInfo phoneInfo = new ContactInfo.PhoneInfo();phoneInfo.type = type;phoneInfo.number = phoneNumber;phoneNumberList.add(phoneInfo);} while (phonesCursor.moveToNext());// 设置联系人电话信息info.setPhoneList(phoneNumberList);}}// 获得联系人的EMAILCursor emailCur = context.getContentResolver().query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null,ContactsContract.CommonDataKinds.Email.CONTACT_ID + "=" + id, null,null);if (emailCur.moveToFirst()) {List<ContactInfo.EmailInfo> emailList = new ArrayList<ContactInfo.EmailInfo>();do {// 遍历所有的emailString email = emailCur.getString(emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA1));int type = emailCur.getInt(emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE));// 初始化联系人邮箱信息ContactInfo.EmailInfo emailInfo = new ContactInfo.EmailInfo();emailInfo.type = type; // 设置邮箱类型emailInfo.email = email; // 设置邮箱地址emailList.add(emailInfo);} while (emailCur.moveToNext());info.setEmail(emailList);}// Cursor postalCursor =// getContentResolver().query(ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_URI,// null,// ContactsContract.CommonDataKinds.StructuredPostal.CONTACT_ID// + "=" + id, null, null);infoList.add(info);} while (cur.moveToNext());}return infoList;}/*** 备份联系人*/public void backupContacts(Activity context, List<ContactInfo> infos) {if (infos.size() <= 0) {Toast.makeText(context, "请先添加联系人", 0).show();return;}try {String path = Environment.getExternalStorageDirectory() + "/"+System.currentTimeMillis()+".vcf";OutputStreamWriter writer = new OutputStreamWriter(new FileOutputStream(path),"UTF-8");VCardComposer composer = new VCardComposer();for (ContactInfo info : infos) {ContactStruct contact = new ContactStruct();contact.name = info.getName();// 获取联系人电话信息, 添加至 ContactStructList<ContactInfo.PhoneInfo> numberList = info.getPhoneList();for (ContactInfo.PhoneInfo phoneInfo : numberList) {contact.addPhone(phoneInfo.type, phoneInfo.number, null, true);}// 获取联系人Email信息, 添加至 ContactStructList<ContactInfo.EmailInfo> emailList = info.getEmail();for (ContactInfo.EmailInfo emailInfo : emailList) {contact.addContactmethod(Contacts.KIND_EMAIL, emailInfo.type,emailInfo.email, null, true);}String vcardString = composer.createVCard(contact,VCardComposer.VERSION_VCARD30_INT);writer.write(vcardString);writer.write("\n");writer.flush();}writer.close();} catch (UnsupportedEncodingException e) {e.printStackTrace();} catch (FileNotFoundException e) {e.printStackTrace();} catch (VCardException e) {e.printStackTrace();} catch (IOException e) {e.printStackTrace();}}/*** 获取vCard文件中的联系人信息* @param path * * @return*/public List<ContactInfo> restoreContacts(String path) throws Exception {List<ContactInfo> contactInfoList = new ArrayList<ContactInfo>();VCardParser parse = new VCardParser();VDataBuilder builder = new VDataBuilder();String file = path;BufferedReader reader = new BufferedReader(new InputStreamReader(new FileInputStream(file), "UTF-8"));String vcardString = "";String line;while ((line = reader.readLine()) != null) {vcardString += line + "\n";}reader.close();boolean parsed = parse.parse(vcardString, "UTF-8", builder);if (!parsed) {throw new VCardException("Could not parse vCard file: " + file);}List<VNode> pimContacts = builder.vNodeList;for (VNode contact : pimContacts) {ContactStruct contactStruct = ContactStruct.constructContactFromVNode(contact, 1);// 获取备份文件中的联系人电话信息List<PhoneData> phoneDataList = contactStruct.phoneList;List<ContactInfo.PhoneInfo> phoneInfoList = new ArrayList<ContactInfo.PhoneInfo>();for (PhoneData phoneData : phoneDataList) {ContactInfo.PhoneInfo phoneInfo = new ContactInfo.PhoneInfo();phoneInfo.number = phoneData.data;phoneInfo.type = phoneData.type;phoneInfoList.add(phoneInfo);}// 获取备份文件中的联系人邮箱信息List<ContactMethod> emailList = contactStruct.contactmethodList;List<ContactInfo.EmailInfo> emailInfoList = new ArrayList<ContactInfo.EmailInfo>();// 存在 Email 信息if (null != emailList) {for (ContactMethod contactMethod : emailList) {if (Contacts.KIND_EMAIL == contactMethod.kind) {ContactInfo.EmailInfo emailInfo = new ContactInfo.EmailInfo();emailInfo.email = contactMethod.data;emailInfo.type = contactMethod.type;emailInfoList.add(emailInfo);}}}ContactInfo info = new ContactInfo(contactStruct.name).setPhoneList(phoneInfoList).setEmail(emailInfoList);contactInfoList.add(info);}return contactInfoList;}/*** 向手机中录入联系人信息* * @param info*            要录入的联系人信息*/public void addContacts(Activity context, ContactInfo info) {ContentValues values = new ContentValues();// 首先向RawContacts.CONTENT_URI执行一个空值插入,目的是获取系统返回的rawContactIdUri rawContactUri = context.getContentResolver().insert(RawContacts.CONTENT_URI, values);long rawContactId = ContentUris.parseId(rawContactUri);// 往data表入姓名数据values.clear();values.put(Data.RAW_CONTACT_ID, rawContactId);values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);values.put(StructuredName.GIVEN_NAME, info.getName());context.getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI,values);// 获取联系人电话信息List<ContactInfo.PhoneInfo> phoneList = info.getPhoneList();/** 录入联系电话 */for (ContactInfo.PhoneInfo phoneInfo : phoneList) {values.clear();values.put(android.provider.ContactsContract.Contacts.Data.RAW_CONTACT_ID,rawContactId);values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);// 设置录入联系人电话信息values.put(Phone.NUMBER, phoneInfo.number);values.put(Phone.TYPE, phoneInfo.type);// 往data表入电话数据context.getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values);}// 获取联系人邮箱信息List<ContactInfo.EmailInfo> emailList = info.getEmail();/** 录入联系人邮箱信息 */for (ContactInfo.EmailInfo email : emailList) {values.clear();values.put(android.provider.ContactsContract.Contacts.Data.RAW_CONTACT_ID,rawContactId);values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);// 设置录入的邮箱信息values.put(Email.DATA, email.email);values.put(Email.TYPE, email.type);// 往data表入Email数据context.getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values);}}}}

源代 https://download.csdn.net/download/qq_26296197/11974840

手机通讯录备份代码实现一相关推荐

  1. 手机通讯录备份代码实现三

    前言 手机通讯录备份代码实现一和二的思路是通过 备份: while循环找到contact_id然后根据id找对应联系人所有电话和邮箱. 还原: 获取联系人列表通过for循环,一个一个插入手机通讯录 这 ...

  2. 手机通讯录备份代码实现二

    手机通讯录备份代码实现二 package app.utils;import java.util.ArrayList; import java.util.List;import android.cont ...

  3. android备份手机号码,Android手机通讯录备份还原代码

    最近想写段Android程序玩玩.开发环境 Eclipse ,Android 2.2 开发环境搭建 1.先安装jdk 2.下载安装eclipse 3.下载安装android sdk 4.安装eclip ...

  4. Android手机通讯录备份和恢复项目

    Android手机通讯录备份和恢复项目 附下载地址** 登录功能 注册功能 找回密码 修改密码 备份功能 恢复功能 恢复数据从服务器 导出为Excel文件 登录功能 注册功能 找回密码 同注册功能 修 ...

  5. 苹果通讯录怎么备份?手机通讯录备份的方法看这里!

    案例:手机通讯录怎么备份? [友友们,想问下苹果手机的通讯录怎么样才能进行备份?可以解答我的疑惑吗?感谢!] 在日常使用手机过程中,我们经常会遇到误删通讯录的情况.因此,备份通讯录是非常重要的,可以避 ...

  6. android手机通讯录备份还原代码,安卓手机误删联系人恢复及备份技巧总汇

    原标题:安卓手机误删联系人恢复及备份技巧总汇 现在很多手机都不再提供将联系人存入SIM卡中的功能了,所以如果你还习惯性的将联系人储存在手机内存当中,一旦手机丢失或者手机数据遗失,那么少则几十动辄几百的 ...

  7. 手机通讯录备份之后,如何在电脑上打开并且如何方便快速的导入另一个手机中

    之前用的是Nokia手机,现在换了一个Lenovo手机. 通讯录备份之后,将备份文件copy至PC上,然后将文件后缀改为.rar格式,解压之后找到contacts文件(在根文件夹里边多找几层,或者直接 ...

  8. 360 android手机备份通讯录,360手机卫士怎样备份手机通讯录 备份手机通讯录图文教程...

    软件安装:手机应用宝 随着科技的发展,手机在我们的生活中扮演了很重要的角色,手机在便利我们生活的同时,也会对我们造成很重要的影响.手机已经成为了我们的必需品,不仅是通讯工具,而且很大程度上都是娱乐功能 ...

  9. android手机通讯录备份还原代码,android手机通讯录备份还原代码

    最近想写段android程序玩玩. 开发环境 eclipse ,android2.2 开发环境搭建 1.先安装jdk 2.下载安装eclipse 3.下载安装android sdk 4.安装eclip ...

最新文章

  1. linux查看硬链接的对应文件,linux查看硬链接对应的所有文件
  2. linux 失败模式,在Linux中在AP模式下扫描失败(wpa_supplicant)
  3. IOS 面试 --- 动画 block
  4. 026-微软Ajax异步组件
  5. mysqlreport查看mysql性能
  6. python迅雷_迅雷下载链接解析器。
  7. c++中的引用和python中的引用_【总结】C++、C#、Java、Javascript、Python中引用的区别...
  8. 企业应用的Ant模组编译环境
  9. 如何避免重要需求遗漏?
  10. 简单好用的照片恢复软件推荐
  11. 设置Webdriver启动chrome为默认用户的配置信息
  12. 计算机编程常见if语句,if编程搞笑语句
  13. 附合导线近似平差计算
  14. 国际信用卡VISA/MasterCard/AE/DC/JCB 卡号结构
  15. 那一年,程维去洗脚城打工,王兴第十次创业失败,张一鸣第五次换工作……...
  16. WINDOWS symbols
  17. android qq侧滑,Android实现QQ的侧滑置顶、删除
  18. matlab 三角分解法 解线性方程组的直接方法
  19. C#中操作Word(9)—— 向Word中插入图表的三种方法(二)
  20. Java 实现数据库数据 导入 导出成Excel文档的功能

热门文章

  1. 雷赛运动控制卡能不能用c语言_弱电知识之三:跟我学做全彩屏,认识LED全彩屏的模组、控制卡...
  2. 听歌识曲java_homework_3
  3. OpenShift 4.3 - 基于虚拟机的BareMetal离线安装(1-2)
  4. OpenShift 4 - 使用ArgoCD Operator
  5. Abp vnext Web应用程序开发教程 3 —— 创建、更新和删除书籍
  6. 构建Docker直觉
  7. Visual Studio Code 11 月 Python 扩展更新
  8. 函数扩展(函数拦截)
  9. 关于ssm框架的全部整合(一) 2021.05.09
  10. java游戏将相_(Java)算法——位运算基础及基本应用