Android 系统联系人操作完整版

在网络上找了很多种版本的联系人操作,但都不尽如人意,现将个人修改,整理的完整版分享出来。以减少大家独自摸索的时间。

包括对联系人手机内置 获取,添加,删除,修改  , 对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


  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值