public class ContactDbHelper
{
/**
* TAG
*/
public static final String TAG = "ContactDbHelper";
/**
* ContentResolver
*/
private final ContentResolver mContentResolver;
/**
* contactManager
*/
private final ContactManager contactManager;
/**
* <默认构造函数>
* @param context context
*/
public ContactDbHelper(Context context)
{
Log.v(TAG, "create ContactDbHelper");
mContentResolver = context.getContentResolver();
contactManager = new ContactManager(context);
}
/**
* 获取所有联系人信息
* <功能详细描述>
* @return List<ContactBean>
* @see [类、类#方法、类#成员]
*/
public List<ContactBean> queryAllContacts()
{
List<ContactBean> contacts = null;
Cursor cur = mContentResolver.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
if (cur.getCount() > 0)
{
contacts = new ArrayList<ContactBean>();
ContactBean contactBean = null;
while (cur.moveToNext())
{
contactBean = new ContactBean();
// id
String id = queryId(cur);
Log.v(TAG, "id:" + id);
// name
String name = queryName(cur);
Log.v(TAG, "name:" + name);
// rawId
String rawId = queryRawId(id);
Log.v(TAG, "rawId:" + rawId);
// phoneNumberList 错的的。
List<PhoneNumberBean> phoneNumberList = queryPhoneNumberList(cur, rawId);
// photo
Bitmap photo = queryPhoto(id);
contactBean.id = id;
contactBean.rawId = rawId;
contactBean.name = name;
contactBean.phoneNumberList = phoneNumberList;
contactBean.photo = photo;
contacts.add(contactBean);
}
}
cur.close();
return sortList(contacts);
}
/**
* 获取Id
* <功能详细描述>
* @param cursor cursor
* @return String
* @see [类、类#方法、类#成员]
*/
private String queryId(Cursor cursor)
{
return cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));
}
/**
* 获取Name
* <功能详细描述>
* @param cursor cursor
* @return String
* @see [类、类#方法、类#成员]
*/
private String queryName(Cursor cursor)
{
return cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));
}
/**
* 获取RawId
* <功能详细描述>
* @param id id
* @return String
* @see [类、类#方法、类#成员]
*/
private String queryRawId(String id)
{
String rawId = "";
Cursor rawContactsIdCur =
mContentResolver.query(RawContacts.CONTENT_URI,
null,
RawContacts.CONTACT_ID + " = ?",
new String[] {id},
null);
if (rawContactsIdCur.moveToFirst())
{
rawId = rawContactsIdCur.getString(rawContactsIdCur.getColumnIndex(RawContacts._ID));
}
rawContactsIdCur.close();
return rawId;
}
/**
* 获取号码列表
* <功能详细描述>
* @param cursor cursor
* @param rawId rawId
* @return List<PhoneNumberBean>
* @see [类、类#方法、类#成员]
*/
private List<PhoneNumberBean> queryPhoneNumberList(Cursor cursor, String rawId)
{
List<PhoneNumberBean> phoneNumberList = null;
if (Integer.parseInt(cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))) > 0)
{
phoneNumberList = new ArrayList<PhoneNumberBean>();
Cursor phoneCur =
mContentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.RAW_CONTACT_ID + " = ?",
new String[] {rawId},
null);
PhoneNumberBean phoneNumberBean = null;
while (phoneCur.moveToNext())
{
phoneNumberBean = new PhoneNumberBean();
String number =
phoneCur.getString(phoneCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
String numberType =
phoneCur.getString(phoneCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
phoneNumberBean.phoneNumber = number;
// if ("1".equals(numberType))
// {
// phoneNumberBean.phoneType = "家庭";
// }
// else if ("2".equals(numberType))
// {
// phoneNumberBean.phoneType = "手机";
// }
// else if ("3".equals(numberType))
// {
// phoneNumberBean.phoneType = "单位";
// }
phoneNumberBean.phoneType = numberType;
phoneNumberList.add(phoneNumberBean);
Log.v(TAG, "numberType:" + numberType);
Log.v(TAG, "number:" + number);
}
phoneCur.close();
}
return phoneNumberList;
}
/**
* 获取头像
* <功能详细描述>
* @param id id
* @return Bitmap
* @see [类、类#方法、类#成员]
*/
private Bitmap queryPhoto(String id)
{
Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, Long.parseLong(id));
InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(mContentResolver, uri);
return BitmapFactory.decodeStream(input);
}
/**
* 增加联系人
* <功能详细描述>
* @param contactBean 联系人信息Bean
* @return ContactBean
* @see [类、类#方法、类#成员]
*/
public ContactBean insert(ContactBean contactBean)
{
String name = contactBean.name;
List<PhoneNumberBean> phoneNumberList = contactBean.phoneNumberList;
String numberHome = "";
String numberMobile = "";
String numberWork = "";
Bitmap photo = contactBean.photo;
PhoneNumberBean mPhoneNumberBean;
for (int i = 0; i < phoneNumberList.size(); i++)
{
mPhoneNumberBean = phoneNumberList.get(i);
String phoneType = mPhoneNumberBean.phoneType;
String phoneNumber = mPhoneNumberBean.phoneNumber;
// if ("家庭".equals(phoneType))
// {
// numberHome = phoneNumber;
// }
// else if ("手机".equals(phoneType))
// {
// numberMobile = phoneNumber;
// }
// else if ("单位".equals(phoneType))
// {
// numberWork = phoneNumber;
// }
if ("1".equals(phoneType))
{
numberHome = phoneNumber;
}
else if ("2".equals(phoneType))
{
numberMobile = phoneNumber;
}
else if ("3".equals(phoneType))
{
numberWork = phoneNumber;
}
}
if ("".equals(name) && "".equals(numberHome) && "".equals(numberMobile) && "".equals(numberWork)
&& (null == photo))
{
return null;
}
// ContentValues values = new ContentValues();
//
// // 下面的操作会根据RawContacts表中已有的rawContactId使用情况自动生成新联系人的rawContactId
// Uri rawContactUri = mContentResolver.insert(RawContacts.CONTENT_URI, values);
// long rawContactId = ContentUris.parseId(rawContactUri);
//
// saveName(values, name, rawContactId);
// saveNumber(values, numberHome, rawContactId, Phone.TYPE_HOME);
// saveNumber(values, numberMobile, rawContactId, Phone.TYPE_MOBILE);
// saveNumber(values, numberWork, rawContactId, Phone.TYPE_WORK);
// savePhoto(values, photo, rawContactId);
//
// contactBean.rawId = String.valueOf(rawContactId);
// return contactBean;
ArrayList<ContentProviderOperation> ops = new ArrayList<ContentProviderOperation>();
ops.add(ContentProviderOperation.newInsert(ContactsContract.RawContacts.CONTENT_URI)
.withValue(ContactsContract.RawContacts.ACCOUNT_TYPE, null)
.withValue(ContactsContract.RawContacts.ACCOUNT_NAME, null)
.withValue(ContactsContract.RawContacts.AGGREGATION_MODE,
ContactsContract.RawContacts.AGGREGATION_MODE_DISABLED)
.build());
saveName(name, ops);
saveNumber(numberHome, Phone.TYPE_HOME, ops);
saveNumber(numberMobile, Phone.TYPE_MOBILE, ops);
saveNumber(numberWork, Phone.TYPE_WORK, ops);
savePhoto(photo, ops);
long rawContactId = 0;
try
{
ContentProviderResult[] results = mContentResolver.applyBatch(ContactsContract.AUTHORITY, ops);
if (results.length >= 1)
{
rawContactId = ContentUris.parseId(results[0].uri);
}
}
catch (Exception e)
{
e.printStackTrace();
}
contactBean.rawId = String.valueOf(rawContactId);
Log.v(TAG, "idid:" + rawContactId);
contactManager.updateByAdd(name, rawContactId, phoneNumberList, photo, false);
return contactBean;
}
/**
* 保存姓名
* <功能详细描述>
* @param name 姓名
* @param ops ArrayList<ContentProviderOperation>
* @see [类、类#方法、类#成员]
*/
private void saveName(String name, ArrayList<ContentProviderOperation> ops)
{
if (null != name && !"".equals(name))
{
ops.add(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, name)
.build());
}
}
/**
* 保存号码
* <功能详细描述>
* @param number 号码
* @param type 号码类型
* @param ops ArrayList<ContentProviderOperation>
* @see [类、类#方法、类#成员]
*/
private void saveNumber(String number, int type, ArrayList<ContentProviderOperation> ops)
{
if (null != number && !"".equals(number))
{
ops.add(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, number)
.withValue(ContactsContract.CommonDataKinds.Phone.TYPE, type)
.build());
}
}
/**
* 保存头像
* <功能详细描述>
* @param photo 头像图片
* @param ops ArrayList<ContentProviderOperation>
* @see [类、类#方法、类#成员]
*/
private void savePhoto(Bitmap photo, ArrayList<ContentProviderOperation> ops)
{
if (null != photo)
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
photo.compress(CompressFormat.PNG, 100, baos);
byte[] bytes = baos.toByteArray();
if (bytes != null)
{
ops.add(ContentProviderOperation.newInsert(ContactsContract.Data.CONTENT_URI)
.withValueBackReference(ContactsContract.Data.RAW_CONTACT_ID, 0)
.withValue(ContactsContract.Data.MIMETYPE,
ContactsContract.CommonDataKinds.Photo.CONTENT_ITEM_TYPE)
.withValue(ContactsContract.CommonDataKinds.Photo.PHOTO, bytes)
.build());
}
}
}
/**
* 保存姓名,用于更新
* <功能详细描述>
* @param values values
* @param name 姓名
* @param rawContactId rawContactId
* @see [类、类#方法、类#成员]
*/
private void saveName(ContentValues values, String name, long rawContactId)
{
if (null != name && !"".equals(name))
{
values.clear();
values.put(Data.RAW_CONTACT_ID, rawContactId);
values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);
values.put(StructuredName.GIVEN_NAME, name);
mContentResolver.insert(ContactsContract.Data.CONTENT_URI, values);
}
}
/**
* 保存号码,用于更新
* <功能详细描述>
* @param values values
* @param number 号码
* @param rawContactId rawContactId
* @param type 号码类型
* @see [类、类#方法、类#成员]
*/
private void saveNumber(ContentValues values, String number, long rawContactId, int type)
{
if (null != number && !"".equals(number))
{
values.clear();
values.put(Data.RAW_CONTACT_ID, rawContactId);
values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);
values.put(Phone.NUMBER, number);
values.put(Phone.TYPE, type);
mContentResolver.insert(ContactsContract.Data.CONTENT_URI, values);
}
}
/**
* 保存头像,用于更新
* <功能详细描述>
* @param values values
* @param photo 头像图片
* @param rawContactId rawContactId
* @see [类、类#方法、类#成员]
*/
private void savePhoto(ContentValues values, Bitmap photo, long rawContactId)
{
if (null != photo)
{
ByteArrayOutputStream baos = new ByteArrayOutputStream();
photo.compress(CompressFormat.PNG, 100, baos);
byte[] bytes = baos.toByteArray();
values.clear();
values.put(Data.RAW_CONTACT_ID, rawContactId);
values.put(Data.MIMETYPE, Photo.CONTENT_ITEM_TYPE);
values.put(Photo.PHOTO, bytes);
mContentResolver.insert(ContactsContract.Data.CONTENT_URI, values);
}
}
/**
* 根据rawContactId删除联系人
* <功能详细描述>
* @param rawContactId rawContactId
* @see [类、类#方法、类#成员]
*/
public void delete(long rawContactId)
{
mContentResolver.delete(ContentUris.withAppendedId(RawContacts.CONTENT_URI, rawContactId), null, null);
contactManager.updateByDelete(rawContactId);
}
/**
* 根据rawContactId更新联系人
* <功能详细描述>
* @param rawContactId rawContactId
* @param contactBean 新联系人信息Bean
* @see [类、类#方法、类#成员]
*/
public void update(String rawContactId, ContactBean contactBean)
{
String name = contactBean.name;
List<PhoneNumberBean> phoneNumberList = contactBean.phoneNumberList;
String numberHome = "";
String numberMobile = "";
String numberWork = "";
Bitmap photo = contactBean.photo;
PhoneNumberBean mPhoneNumberBean = null;
String phoneType = "";
String phoneNumber = "";
for (int i = 0; i < phoneNumberList.size(); i++)
{
mPhoneNumberBean = phoneNumberList.get(i);
phoneType = mPhoneNumberBean.phoneType;
phoneNumber = mPhoneNumberBean.phoneNumber;
// if ("家庭".equals(phoneType))
// {
// numberHome = phoneNumber;
// }
// else if ("手机".equals(phoneType))
// {
// numberMobile = phoneNumber;
// }
// else if ("单位".equals(phoneType))
// {
// numberWork = phoneNumber;
// }
if ("1".equals(phoneType))
{
numberHome = phoneNumber;
}
else if ("2".equals(phoneType))
{
numberMobile = phoneNumber;
}
else if ("3".equals(phoneType))
{
numberWork = phoneNumber;
}
}
ContentValues values = new ContentValues();
// updateName(values, name, rawContactId);
// updateNumber(values, numberHome, rawContactId, Phone.TYPE_HOME);
// updateNumber(values, numberMobile, rawContactId, Phone.TYPE_MOBILE);
// updateNumber(values, numberWork, rawContactId, Phone.TYPE_WORK);
// updatePhoto(values, photo, rawContactId);
String where = ContactsContract.Data.RAW_CONTACT_ID + " = ? ";
String[] whereParams = new String[] {rawContactId};
mContentResolver.delete(ContactsContract.Data.CONTENT_URI, where, whereParams);
saveName(values, name, Long.parseLong(rawContactId));
saveNumber(values, numberHome, Long.parseLong(rawContactId), Phone.TYPE_HOME);
saveNumber(values, numberMobile, Long.parseLong(rawContactId), Phone.TYPE_MOBILE);
saveNumber(values, numberWork, Long.parseLong(rawContactId), Phone.TYPE_WORK);
savePhoto(values, photo, Long.parseLong(rawContactId));
long rawId = Long.parseLong(rawContactId);
contactManager.updateByAdd(name, rawId, phoneNumberList, photo, true);
}
// /**
// * 更新姓名
// * <功能详细描述>
// * @param values values
// * @param name 姓名
// * @param rawContactId rawContactId
// * @see [类、类#方法、类#成员]
// */
// public void updateName(ContentValues values, String name, String rawContactId)
// {
// Log.v(TAG, "update name:" + name);
// values.clear();
// values.put(StructuredName.GIVEN_NAME, name);
// String where = ContactsContract.Data.RAW_CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?";
// String[] whereParams = new String[] {rawContactId, StructuredName.CONTENT_ITEM_TYPE,};
// mContentResolver.update(ContactsContract.Data.CONTENT_URI, values, where, whereParams);
//
// }
//
// /**
// * 更新号码
// * <功能详细描述>
// * @param values values
// * @param number 号码
// * @param rawContactId rawContactId
// * @param type 号码类型
// * @see [类、类#方法、类#成员]
// */
// public void updateNumber(ContentValues values, String number, String rawContactId, int type)
// {
// Log.v(TAG, "update number:" + number + " type:" + type);
// values.clear();
// values.put(Phone.NUMBER, number);
// String where =
// ContactsContract.Data.RAW_CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ? AND "
// + Phone.TYPE + " = ?";
// String[] whereParams = new String[] {rawContactId, Phone.CONTENT_ITEM_TYPE, String.valueOf(type)};
// mContentResolver.update(ContactsContract.Data.CONTENT_URI, values, where, whereParams);
//
// }
//
// /**
// * 更新头像
// * <功能详细描述>
// * @param values values
// * @param photo 头像
// * @param rawContactId rawContactId
// * @see [类、类#方法、类#成员]
// */
// public void updatePhoto(ContentValues values, Bitmap photo, String rawContactId)
// {
//
// if (null != photo)
// {
// Log.v(TAG, "update photo");
// ByteArrayOutputStream baos = new ByteArrayOutputStream();
// photo.compress(CompressFormat.JPEG, 50, baos);
// byte[] bytes = baos.toByteArray();
//
// values.clear();
// values.put(Photo.PHOTO, bytes);
// String where = ContactsContract.Data.RAW_CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?";
// String[] whereParams = new String[] {rawContactId, Photo.CONTENT_ITEM_TYPE,};
// mContentResolver.update(ContactsContract.Data.CONTENT_URI, values, where, whereParams);
// }
// }
/**
* 根据号码查询联系人信息
* <功能详细描述>
* @param number 号码
* @return PhoneNumberBean
* @see [类、类#方法、类#成员]
*/
public PhoneNumberBean queryContactInfoByNumber(String number)
{
PhoneNumberBean phoneNumberBean = new PhoneNumberBean();
// String[] projection =
// {ContactsContract.PhoneLookup.DISPLAY_NAME, ContactsContract.CommonDataKinds.Phone.NUMBER};
Cursor cursor =
mContentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.NUMBER + " = '" + number + "'",
null,
null);
if (cursor == null)
{
Log.v(TAG, "getPeople null");
return null;
}
Log.v(TAG, "getPeople cursor.getCount() = " + cursor.getCount());
if (0 == cursor.getCount())
{
Log.v(TAG, "no people has this number");
return null;
}
// for (int i = 0; i < cursor.getCount(); i++) {
// cursor.moveToPosition(i);
//默认查询第一个联系人姓名,这点参照android2.2自带联系人应用的处理方式
cursor.moveToPosition(0);
phoneNumberBean.phoneNumber = number;
Log.v(TAG, "number:" + number);
phoneNumberBean.id =
cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.RAW_CONTACT_ID));
Log.v(TAG, "id:" + phoneNumberBean.id);
phoneNumberBean.cached_name =
cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME));
Log.v(TAG, "cached_name:" + phoneNumberBean.cached_name);
phoneNumberBean.phoneType =
cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
Log.v(TAG, "phoneType:" + phoneNumberBean.phoneType);
// }
cursor.close();
return phoneNumberBean;
}
/**
* 根据号码查询联系人详细信息
* <功能详细描述>
* @param number 号码
* @return ContactBean
* @see [类、类#方法、类#成员]
*/
public ContactBean queryDetailByNumber(String number)
{
ContactBean contactBean = new ContactBean();
Cursor cursor =
mContentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.NUMBER + " = '" + number + "'",
null,
null);
if (cursor == null)
{
Log.v(TAG, "getPeople null");
return null;
}
Log.v(TAG, "getPeople cursor.getCount() = " + cursor.getCount());
if (0 == cursor.getCount())
{
Log.v(TAG, "no people has this number");
return null;
}
contactBean.phoneNumber = number;
cursor.moveToPosition(0);
String id = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID));
String rawId = cursor.getString(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.RAW_CONTACT_ID));
contactBean.id = id;
contactBean.rawId = rawId;
String name = cursor.getString(cursor.getColumnIndex(ContactsContract.PhoneLookup.DISPLAY_NAME));
contactBean.name = name;
cursor.close();
List<PhoneNumberBean> phoneNumberList = new ArrayList<PhoneNumberBean>();
Cursor phoneCur =
mContentResolver.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
null,
ContactsContract.CommonDataKinds.Phone.RAW_CONTACT_ID + " = ?",
new String[] {rawId},
null);
PhoneNumberBean phoneNumberBean = null;
while (phoneCur.moveToNext())
{
phoneNumberBean = new PhoneNumberBean();
String bufNumber =
phoneCur.getString(phoneCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
String numberType =
phoneCur.getString(phoneCur.getColumnIndex(ContactsContract.CommonDataKinds.Phone.TYPE));
phoneNumberBean.phoneNumber = bufNumber;
phoneNumberBean.phoneType = numberType;
phoneNumberList.add(phoneNumberBean);
Log.v(TAG, "numberType:" + numberType);
Log.v(TAG, "number:" + bufNumber);
}
phoneCur.close();
contactBean.phoneNumberList = phoneNumberList;
Log.v(TAG, "iiiiiiiiid:" + id);
Bitmap photo = queryPhoto(id);
contactBean.photo = photo;
return contactBean;
}
/**
* 根据号码查询联系人详细信息,分析含有+86的手机号码
* <功能详细描述>
* @param number 号码
* @return ContactBean
* @see [类、类#方法、类#成员]
*/
public ContactBean queryDetailByNumberInclude86(String number)
{
ContactBean c = queryDetailByNumber(number);
if (null != c)
{
return c;
}
int l = number.length();
if (11 == l)
{
c = queryDetailByNumber("86" + number);
if (null != c)
{
return c;
}
c = queryDetailByNumber("+86" + number);
if (null != c)
{
return c;
}
}
if (13 == l && number.startsWith("86"))
{
c = queryDetailByNumber(number.substring(2));
if (null != c)
{
return c;
}
c = queryDetailByNumber("+" + number);
if (null != c)
{
return c;
}
}
if (14 == l && number.startsWith("+86"))
{
c = queryDetailByNumber(number.substring(3));
if (null != c)
{
return c;
}
c = queryDetailByNumber(number.substring(1));
if (null != c)
{
return c;
}
}
return null;
}
/**
* 联系人列表排序
* <功能详细描述>
* @param contactList 联系人列表
* @return 排序后的联系人列表
* @see [类、类#方法、类#成员]
*/
public static List<ContactBean> sortList(List<ContactBean> contactList)
{
if (null == contactList)
{
return null;
}
//SortComparator sortComparator = new SortComparator();
GeiliSortComparator geiliSortComparator = new GeiliSortComparator();
Collections.sort(contactList, geiliSortComparator);
return contactList;
}