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

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

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;
	}

	@Override
	public 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);
					// 查看联系人有多少电话号码, 如果没有返回0
					int 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);
						}
					}

					// 获得联系人的EMAIL
					Cursor 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 {
							// 遍历所有的email
							String 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();
					// 获取联系人电话信息, 添加至 ContactStruct
					List<ContactInfo.PhoneInfo> numberList = info.getPhoneList();
					for (ContactInfo.PhoneInfo phoneInfo : numberList) {
						contact.addPhone(phoneInfo.type, phoneInfo.number, null, true);
					}
					// 获取联系人Email信息, 添加至 ContactStruct
					List<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执行一个空值插入,目的是获取系统返回的rawContactId
			Uri 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

发布了277 篇原创文章 · 获赞 84 · 访问量 38万+

猜你喜欢

转载自blog.csdn.net/qq_26296197/article/details/103050879
今日推荐