在网络上找了很多种版本的联系人操作,但都不尽如人意,现将个人修改,整理的完整版分享出来。以减少大家独自摸索的时间。
包括对联系人手机内置 获取,添加,删除,修改 , 对SIM卡联系人 获取,添加,删除,修改。
public class ContactData
{
String id;
String name;
String number;
public void setId(String idValue){
id = idValue;
}
public void setContactName(String contactName){
name = contactName;
}
public void setNumber(String phoneNumber){
number = phoneNumber;
}
public String getId(){
return id;
}
public String getContactName(){
return name;
}
public String getNumber(){
return number;
}
}
/**
* 用于联系人获取,添加,删除,修改,排序等操作。
* */
public class ContactsAccessPublic
{
final static String TAG = "ContactsAccess";
final static String PhoneAccountName = "Phone";
final static String SIMAccountName = "SIM";
// 读取联系人信息
public static List<ContactData> getPhoneContacts(Context context, List<ContactData> list, boolean bSort)
{
if(list == null)
list = new ArrayList<ContactData>();
Cursor cursor = context.getContentResolver().query(RawContacts.CONTENT_URI,
null,
RawContacts.ACCOUNT_NAME + "=?",
new String[]{"Phone"}, null);
while (cursor.moveToNext())
{
int indexId = cursor.getColumnIndex(ContactsContract.Contacts._ID);
String contactId = cursor.getString(indexId);
int indexDisplayName = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
String name = cursor.getString(indexDisplayName);
Cursor phones = context.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null,
ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null);
while (phones.moveToNext())
{
String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
ContactData data = new ContactData();
data.id = contactId;
data.name = name;
data.number = phoneNumber;
list.add(data);
}
phones.close();
}
cursor.close();
return list;
}
public static List<ContactData> getSIMContacts(Context context, List<ContactData> list, boolean bSort) {
if(list == null)
list = new ArrayList<ContactData>();
CharacterParser characterParser = CharacterParser.getInstance();
ContentResolver resolver = context.getContentResolver();
// 获取Sims卡联系人
Uri uri = Uri.parse("content://icc/adn");
Cursor phoneCursor = resolver.query(uri, null, null, null,null);
//"sort_key asc");
if (phoneCursor != null) {
while (phoneCursor.moveToNext()) {
for(int i=0; i<phoneCursor.getColumnCount(); i++){
String columnName = phoneCursor.getColumnName(i);
String value = phoneCursor.getString(i);
Log.e("","i: "+columnName+" value: "+value);
}
// 得到手机号码
// String phoneNumber = phoneCursor.getString(PHONES_NUMBER_INDEX);
//Phone._ID,
// Phone.DISPLAY_NAME, Phone.NUMBER, "number"
//FIXME 2.2 与 4.0 不一样。
int numberIndex = phoneCursor.getColumnIndex(Phone.NUMBER);
if(numberIndex == -1){
numberIndex = phoneCursor.getColumnIndex("number"); // Android2.2
}
String phoneNumber = phoneCursor.getString(numberIndex);
// 当手机号码为空的或者为空字段 跳过当前循环
if (TextUtils.isEmpty(phoneNumber)) {
continue;
}
// 得到联系人名称
int nameIndex = phoneCursor.getColumnIndex(Phone.DISPLAY_NAME);
if(nameIndex == -1)
nameIndex = phoneCursor.getColumnIndex("name");// Android2.2
String contactName = phoneCursor.getString(nameIndex);//phoneCursor.getString(PHONES_DISPLAY_NAME_INDEX);
//Sim卡中没有联系人头像
ContactData data = new ContactData();
data.setId(phoneCursor.getString(phoneCursor.getColumnIndex(Phone._ID))); //(phoneCursor.getString(PHONES_ID_INDEX));
data.setContactName(contactName);
data.setNumber(phoneNumber);
list.add(data);
}
phoneCursor.close();
}
return list;
}
public static long insertSIMContact(Context context, ContactData contact)
{
ContentValues values = new ContentValues();
Uri uri = Uri.parse("content://icc/adn");
values.clear();
values.put("tag", contact.getContactName());
values.put("number", contact.getNumber());
ContentResolver resolver = context.getContentResolver();
// Uri newSimContactUri = resolver.insert(uri, values); //Android4.0
///
//for android 2.2
Uri newSimContactUri = null;
try{
newSimContactUri = resolver.insert(uri, values);
}
catch(Exception e){
e.printStackTrace();
// values.clear();
values.put("name", contact.getContactName());
// values.put("number", contact.getNumber());
// newSimContactUri = resolver.insert(uri, values);
}
if(newSimContactUri != null){
long id = ContentUris.parseId(newSimContactUri);
contact.setId(id+"");
return id;
}
else
return -1;
}
public static boolean updateSIMContact(Context context,ContactData oldContact, ContactData newContact)
{
Uri uri = Uri.parse("content://icc/adn");
ContentValues values = new ContentValues();
values.put("tag", oldContact.getContactName());
values.put("number", oldContact.getNumber());
values.put("newTag", newContact.getContactName());
values.put("newNumber", newContact.getNumber());
int rc = context.getContentResolver().update(uri, values, null, null);
if (rc > 0){
return true;
}
else{
return false;
}
}
public static boolean insertPhoneContact(Context context, ContactData contact){
/**
* 首先向RawContacts.CONTENT_URI执行一个空值插入,目的是获取系统返回的rawContactId
* 这时后面插入data表的依据,只有执行空值插入,才能使插入的联系人在通讯录里面可见
*/
Uri rcUri;
ContentValues values = new ContentValues();
// ContentResolver resolver = context.getContentResolver();
//首先向RawContacts.CONTENT_URI执行一个空值插入,目的是获取系统返回的rawContactId
values.put(RawContacts.ACCOUNT_NAME, PhoneAccountName);
values.put(RawContacts.ACCOUNT_TYPE, "null");
values.put(ContactsContract.Contacts.DISPLAY_NAME, contact.getContactName());
Uri rawContactUri =context.getContentResolver().insert(RawContacts.CONTENT_URI, values);
long rawContactId = ContentUris.parseId(rawContactUri);
contact.setId(rawContactId+"");
//往data表入姓名数据
values.clear();
values.put(Data.RAW_CONTACT_ID,rawContactId);
values.put(Data.MIMETYPE,StructuredName.CONTENT_ITEM_TYPE);//内容类型
values.put(StructuredName.GIVEN_NAME,contact.getContactName());
rcUri = context.getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI,values);
if(rcUri != null){
//往data表入电话数据
values.clear();
values.put(Data.RAW_CONTACT_ID,rawContactId);
values.put(Data.MIMETYPE,Phone.CONTENT_ITEM_TYPE);
values.put(Phone.NUMBER,contact.getNumber());
values.put(Phone.TYPE,Phone.TYPE_WORK);
rcUri = context.getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI,values);
}
return (rcUri != null);
}
public static boolean updatePhoneContact(Context context, ContactData contact){
ContentValues values = new ContentValues();
values.clear();
values.put(ContactsContract.Contacts.DISPLAY_NAME, contact.getContactName());
int rc1 = context.getContentResolver().update(RawContacts.CONTENT_URI,values,
ContactsContract.Contacts._ID + "=?", new String[]{contact.getId()});
values.clear();
values.put(Data.MIMETYPE,Phone.CONTENT_ITEM_TYPE);
values.put(Phone.NUMBER,contact.getNumber());
int rc2 = context.getContentResolver().update(android.provider.ContactsContract.Data.CONTENT_URI,values,
Data.RAW_CONTACT_ID + "=?", new String[]{contact.getId()+""});
return (rc1>0 || rc2 >0) ? true : false;
}
/**根据contactId删除联系人数据*/
public static int deletePhoneContact(Context context,String name, String contactId)
{
ContentResolver resolver = context.getContentResolver();
int rc1 = 0, rc2 = 0;
//删除data表中数据
String where = ContactsContract.Data.CONTACT_ID + " =?";
String[] whereparams = new String[] { contactId };
rc1 = resolver.delete(ContactsContract.Data.CONTENT_URI, where, whereparams);
//删除rawContact表中数据
where = ContactsContract.RawContacts.CONTACT_ID + " =?";
whereparams = new String[] { contactId };
rc2 = resolver.delete(ContactsContract.RawContacts.CONTENT_URI, where, whereparams);
return (rc1>0 && rc2>0) ? (rc1+rc2) : 0;
}
public static int deleteSIMContact(Context context,ContactData contact)throws Exception{
Log.e("","deleteSIMContact name:"+contact.getContactName()+" id:"+contact.getId());
Uri uri = Uri.parse("content://icc/adn");
ContentResolver resolver = context.getContentResolver();
int rc = resolver.delete(uri, "tag="+contact.getContactName()+" AND number="+contact.getNumber(),null);
Log.e("", "rc2 = "+rc);
return rc;
}
其中包含部分其他博主的内容例如:
http://blog.csdn.net/lksodit_yiyi/article/details/7887228