前几天,我爸换了一个新的手机,然后通讯录就要转移到新的手机上,作为一个爱折腾的我就有点按耐不住了,于是就想做一个转移通讯录的小程序,我用的方法是老手机先将通讯录的内容传到服务器上的sql server数据库中,然后新手机获取数据库中的内容,这样就完成了转移,读写联系人也是参照网上的代码,我就把我的核心代码分享一下,方便以后巩固.
获取通讯录联系人和号码存入到一个list中:
mList.clear();
ContentResolver resolver = this.getContentResolver();
Cursor phoneCursor = resolver.query(Phone.CONTENT_URI,
PHONES_PROJECTION, null, null, null);
if (phoneCursor != null) {
while (phoneCursor.moveToNext()) {
// 获取手机号码
String phoneNumber = phoneCursor.getString(PHONES_NUMBER_INDEX);
if (TextUtils.isEmpty(phoneNumber)) {
continue;
}
Contacts contacts = new Contacts();
// 得到联系人
String phoneName = phoneCursor
.getString(PHONES_DISPLAY_NAME_INDEX);
contacts.phone_Name = phoneName;
contacts.phone_Telephone = phoneNumber;
mList.add(contacts);
}
}
Phones_Projection数组,PHONES_DISPLAY_NAME_INDEX和PHONES_NUMBER_INDEX常量:
private static final String[] PHONES_PROJECTION = new String[] {
Phone.DISPLAY_NAME, Phone.NUMBER };
/** 联系人显示名称 **/
private static final int PHONES_DISPLAY_NAME_INDEX = 0;
/** 电话号码 **/
private static final int PHONES_NUMBER_INDEX = 1;
就是查找联系人和电话这两列,因为他们本质上都是存在sqlite数据库中的
写入通讯录:
private void addContact(String lianxiren, String telephone) {
ContentResolver resolver = getContentResolver();
ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>();
// 下面的操作会根据表中已有的id使用情况自动生成新联系人的一行
ContentProviderOperation op1 = ContentProviderOperation
.newInsert(ContactsContract.RawContacts.CONTENT_URI)
.withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
.withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
.build();
operations.add(op1);
// 添加联系人
ContentProviderOperation op2 = ContentProviderOperation
.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(
ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.StructuredName.CONTENT_ITEM_TYPE)
.withValue(
ContactsContract.CommonDataKinds.StructuredName.DISPLAY_NAME,
lianxiren).build();
operations.add(op2);
// 添加联系电话
ContentProviderOperation op3 = ContentProviderOperation
.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(
ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.Phone.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Phone.NUMBER,
telephone)
.withValue(ContactsContract.CommonDataKinds.Phone.TYPE,
ContactsContract.CommonDataKinds.Phone.TYPE_CUSTOM)
.build();
operations.add(op3);
try {
resolver.applyBatch(ContactsContract.AUTHORITY, operations);
} catch (Exception e) {
e.printStackTrace();
}
}