A罩杯 发表于 2013-8-28 16:28

对通讯录的各项操作,完整版,经过测试,方便后来者

79 本帖最后由 YooHi 于 2013-7-1 19:26 编辑       新手一枚,刚学到此处,综合前人经验,搞定此处理,方便后来者,错误及待优化之处往高手指点,感谢!   
   
---------------------------------------------------MainActivity------------------------------------------------------------------------------------------------------   
package com.eboy.readwritecontact;   
import android.os.Bundle;   
import android.app.Activity;   
import android.util.Log;   
import android.view.Menu;   
import com.eboy.test.*;   
public class MainActivity extends Activity {   
String strName = "";   
String strPhone = "";   
String strAllContacts = "";   
   
final String tag ="MainThread";   
ContactsOptions ct = new ContactsOptions();   
   
    @Override   
    public void onCreate(Bundle savedInstanceState) {   
      super.onCreate(savedInstanceState);   
      setContentView(R.layout.activity_main);   
         
      try {   
   //添加用户信息   
   //String name, String phone, String email, String address, String nickname,   
   //String organization, String website, String QQ   
   ct.AddOneContact(this, "张三", "33333333333", "88888888@139.com", "江苏省徐州市,221600",   
   "zhangsan", "中国石化", "http://www.yoohi.com.cn", "12345678");   
      
         //依据号码查询姓名/邮箱/。。。。。。,多个返回之间用下划线"_"分割   
   //(Context,number,name,mimetype)   
         strName = ct.QueryContacts(this, "13916061000", "", "vnd.android.cursor.item/email_v2");   
         //String str[] = strName.split("_");//int i = str.length;   
            
         //依据姓名查询号码/邮箱/。。。。。。。。,多个返回之间用下划线"_"分割   
   strPhone = ct.QueryContacts(this, "","First", "vnd.android.cursor.item/email_v2");   
   Log.i(tag, "strName:" + strName + "strPhone:" + strPhone);   
      
   //String str1[] = strPhone.split("_");//int i = str1.length;   
      
   //查询所有用户列表及对应信息   
   strAllContacts = ct.ReadAllContacts(this);   
   Log.i(tag, strAllContacts);   
      
         //String name, String phone, String email, String address, String nickname,   
   //String organization, String website, String QQ   
         //name_phone_email_address_nickname_organization_website_qq_   
         String contact[] = {"first_13011111111_hello@china.com__nickname_easyfly_www.yoohi.cn_87654321_",   
         "second_13022222222_hello@china.com__nickname_easyfly_www.yoohi.cn_87654321_",   
         "third_13033333333_thanks@china.com_江苏徐州_peter_yoohi_www.yoohi.com.cn_12345678_",   
         "four_13044444444_zhejiang@china.com_中国上海_michael_easyfly_www.yoohi.taobao.com_88884444_"};   
         ct.AddContactsInTransaction(this,contact);   
            
         //update contact   
         ct.UpdateContact(this, "second", "88888888888");   
            
         //(Context,name1_name2_name3_)   
         ct.DeleteContact(this, "first_second_third_four_");   
            
            
            
} catch (Exception e) {   
   e.printStackTrace();   
   Log.i(tag, "---------------------------------------");   
}   
    }   
    @Override   
    public boolean onCreateOptionsMenu(Menu menu) {   
      getMenuInflater().inflate(R.menu.activity_main, menu);   
      return true;   
    }   
}   
------------------------------------------ContactsOptions ---------------------------------------------------------------------------------------------------------------   
package com.eboy.test;   
import java.util.ArrayList;   
import android.content.ContentProviderOperation;   
import android.content.ContentResolver;   
import android.content.ContentUris;   
import android.content.ContentValues;   
import android.content.Context;   
import android.database.Cursor;   
import android.net.Uri;   
import android.provider.ContactsContract.Data;   
import android.test.AndroidTestCase;   
import android.util.Log;   
/*   
1.先读取contacts表,获取ContactsID;   
2.再在raw_contacts表中根据ContactsID获取RawContactsID;   
3.然后就可以在data表中根据RawContactsID获取该联系人的各数据了;   
*/   
public class ContactsOptions extends AndroidTestCase {   
private String strQuery = "";   
private String strReadAll = "";   
private static final String tag = "TestContact";   
// 查询指定电话的联系人姓名,邮箱,   
public String QueryContacts(Context context, String number, String name,   
   String mimetype) throws Exception {   
if (context == null || (name.length() == 0 && number.length() == 0))   
   return strQuery;   
String str = "";   
strQuery = "";   
Uri uri = Uri   
    .parse("content://com.android.contacts/data/phones/filter/"   
      + number);   
ContentResolver resolver = context.getContentResolver();   
// 按照号码查询名字   
if (number.length() > 0) {   
   Cursor cursor = resolver.query(uri,   
   new String[] { Data.DISPLAY_NAME }, null, null, null);   
   if (cursor.moveToFirst()) {   
    strQuery = cursor.getString(0);   
    name = strQuery;   
    // 表示通过号码查询其他内容   
    if (mimetype.length() > 0) {   
   strQuery = "";   
    }   
    // Log.i(tag, strQuery);   
   }   
   cursor.close();   
}   
// 按照名字查询号码   
if (name.length() > 0) {   
   uri = Uri.parse("content://com.android.contacts/data");   
   Cursor cursor = resolver.query(uri, new String[] { Data.DATA1,   
   Data.MIMETYPE }, "display_name=?", new String[] { name },   
   null);   
   if (cursor.moveToFirst()) {   
    do {// 遍历所有的电话号码   
   // str = cursor.getString(0);   
   // Log.i("遍历:", str+"/");   
   if (cursor.getString(cursor.getColumnIndex("mimetype"))   
       .equals(mimetype)) {   
      str = "";   
      str = cursor.getString(0);   
      strQuery += str.replace("-", "") + "_";   
   }   
    } while (cursor.moveToNext());   
   }   
   cursor.close();   
   return strQuery;// phone   
}   
return strQuery;   
}   
// 读取通讯录的全部的联系人   
// 需要先在raw_contact表中遍历id,并根据id到data表中获取数据   
public String ReadAllContacts(Context context) {   
Uri uri = Uri.parse("content://com.android.contacts/contacts"); // 访问raw_contacts表   
ContentResolver resolver = context.getContentResolver();   
Cursor cursor = resolver.query(uri, new String[] { Data._ID }, null,   
    null, null); // 获得_id属性   
while (cursor.moveToNext()) {   
   StringBuilder buf = new StringBuilder();   
   int id = cursor.getInt(0);// 获得id并且在data中寻找数据   
   buf.append("id=" + id);   
   uri = Uri.parse("content://com.android.contacts/contacts/" + id   
   + "/data"); // 如果要获得data表中某个id对应的数据,则URI为content://com.android.contacts/contacts/#/data   
   Cursor cursor2 = resolver.query(uri, new String[] { Data.DATA1,   
   Data.MIMETYPE }, null, null, null); // data1存储各个记录的总数据,mimetype存放记录的类型,如电话、email等   
   while (cursor2.moveToNext()) {   
    String data = cursor2   
      .getString(cursor2.getColumnIndex("data1"));   
    if (cursor2.getString(cursor2.getColumnIndex("mimetype"))   
      .equals("vnd.android.cursor.item/name")) { // 如果是名字   
   buf.append(",name=" + data);   
    } else if (cursor2   
      .getString(cursor2.getColumnIndex("mimetype")).equals(   
      "vnd.android.cursor.item/phone_v2")) { // 如果是电话   
   data = data.replace("-", "");   
   buf.append(",phone=" + data);   
    } else if (cursor2   
      .getString(cursor2.getColumnIndex("mimetype")).equals(   
      "vnd.android.cursor.item/email_v2")) { // 如果是email   
   buf.append(",email=" + data);   
    } else if (cursor2   
      .getString(cursor2.getColumnIndex("mimetype")).equals(   
      "vnd.android.cursor.item/nickname")) { // 如果是昵称   
   buf.append(",nickname=" + data);   
    } else if (cursor2   
      .getString(cursor2.getColumnIndex("mimetype")).equals(   
      "vnd.android.cursor.item/postal-address_v2")) { // 如果是地址   
   buf.append(",address=" + data);   
    } else if (cursor2   
      .getString(cursor2.getColumnIndex("mimetype")).equals(   
      "vnd.android.cursor.item/organization")) { // 如果是组织   
   buf.append(",organization=" + data);   
    } else if (cursor2   
      .getString(cursor2.getColumnIndex("mimetype")).equals(   
      "vnd.android.cursor.item/website")) { // 如果是website   
   buf.append(",website=" + data);   
    } else if (cursor2   
      .getString(cursor2.getColumnIndex("mimetype")).equals(   
      "vnd.android.cursor.item/note")) { // 如果是note   
   buf.append(",note=" + data);   
    }   
   }   
   String str = buf.toString();   
   strReadAll += "
" + str;   
}   
return strReadAll;   
}   
// 单条添加   
public void AddOneContact(Context context, String name, String phone,   
   String email, String address, String nickname, String organization,   
   String website, String QQ) {   
// 插入raw_contacts表,并获取_id属性   
Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");   
ContentResolver resolver = context.getContentResolver();   
ContentValues values = new ContentValues();   
long contact_id = ContentUris.parseId(resolver.insert(uri, values));   
// 插入data表   
uri = Uri.parse("content://com.android.contacts/data");   
// add Name   
if (name.length() > 0) {   
   values.put("raw_contact_id", contact_id);   
   values.put(Data.MIMETYPE, "vnd.android.cursor.item/name");   
   // values.put("data2", "zs001");   
   values.put("data1", name);   
   resolver.insert(uri, values);   
   values.clear();   
}   
// add Phone   
if (phone.length() > 0) {   
   values.put("raw_contact_id", contact_id);   
   values.put(Data.MIMETYPE, "vnd.android.cursor.item/phone_v2");   
   // values.put("data2", "2"); // 手机   
   values.put("data1", phone);   
   resolver.insert(uri, values);   
   values.clear();   
}   
// add email   
if (email.length() > 0) {   
   values.put("raw_contact_id", contact_id);   
   values.put(Data.MIMETYPE, "vnd.android.cursor.item/email_v2");   
   // values.put("data2", "2");   
   values.put("data1", email);   
   resolver.insert(uri, values);   
   values.clear();   
}   
// add address   
if (address.length() > 0) {   
   values.put("raw_contact_id", contact_id);   
   values.put(Data.MIMETYPE,   
   "vnd.android.cursor.item/postal-address_v2");   
   // values.put("data2", "2");   
   values.put("data1", address);   
   resolver.insert(uri, values);   
   values.clear();   
}   
// add nickname   
if (nickname.length() > 0) {   
   values.put("raw_contact_id", contact_id);   
   values.put(Data.MIMETYPE, "vnd.android.cursor.item/nickname");   
   // values.put("data2", "2");   
   values.put("data1", nickname);   
   resolver.insert(uri, values);   
   values.clear();   
}   
// add organization   
if (organization.length() > 0) {   
   values.put("raw_contact_id", contact_id);   
   values.put(Data.MIMETYPE, "vnd.android.cursor.item/organization");   
   // values.put("data2", "2");   
   values.put("data1", organization);   
   resolver.insert(uri, values);   
   values.clear();   
}   
// add website   
if (website.length() > 0) {   
   values.put("raw_contact_id", contact_id);   
   values.put(Data.MIMETYPE, "vnd.android.cursor.item/website");   
   // values.put("data2", "2");   
   values.put("data1", website);   
   resolver.insert(uri, values);   
   values.clear();   
}   
// add QQ   
if (QQ.length() > 0) {   
   values.put("raw_contact_id", contact_id);   
   values.put(Data.MIMETYPE, "vnd.android.cursor.item/note");   
   // values.put("data2", "2"); // 单位   
   values.put("data1", QQ);   
   resolver.insert(uri, values);   
   values.clear();   
}   
}   
// 批量添加   
public void AddContactsInTransaction(Context context, String contacts[])   
   throws Exception {   
Uri uri;   
ContentResolver resolver = context.getContentResolver();   
ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>();   
String str[] = null;   
for (int i = 0; i < contacts.length; i++) {   
   str = contacts.split("_");   
   uri = Uri.parse("content://com.android.contacts/raw_contacts");   
   // 向raw_contact表添加一条记录   
   // 此处.withValue("account_name", null)一定要加,不然会抛NullPointerException   
   ContentProviderOperation operation1 = ContentProviderOperation   
   .newInsert(uri).withValue("account_name", null).build();   
   operations.add(operation1);   
   // 向data添加数据   
   uri = Uri.parse("content://com.android.contacts/data");   
   // 添加姓名   
   ContentProviderOperation operation2 = ContentProviderOperation   
   .newInsert(uri)   
   .withValueBackReference("raw_contact_id", 3 * i)   
   // withValueBackReference的第二个参数表示引用operations的操作的返回id作为此值   
   .withValue("mimetype", "vnd.android.cursor.item/name")   
   .withValue("data1", str).build();   
   operations.add(operation2);   
   // 添加手机数据   
   ContentProviderOperation operation3 = ContentProviderOperation   
   .newInsert(uri)   
   .withValueBackReference("raw_contact_id", 3 * i)   
   .withValue("mimetype", "vnd.android.cursor.item/phone_v2")   
   .withValue("data2", "1").withValue("data1", str).build();// data2部分数据代表home,mobile,work等等属性   
   operations.add(operation3);   
}   
resolver.applyBatch("com.android.contacts", operations);   
}   
// 删除某人通讯录,name格式name1_name2_name3_.......以_结束   
public void DeleteContact(Context context, String name) throws Exception {   
Uri uri;   
String str[] = name.split("_");// 姓名list   
for (int i = 0; i < str.length; i++) {   
   // 根据姓名求id   
   uri = Uri.parse("content://com.android.contacts/raw_contacts");   
   ContentResolver resolver = context.getContentResolver();   
   Cursor cursor = resolver.query(uri, new String[] { Data._ID },   
   "display_name=?", new String[] { str }, null);   
   if (cursor.moveToFirst()) {   
    int id = cursor.getInt(0);   
    Log.i(tag, "delete id:" + id);   
    // 根据id删除data中的相应数据   
    resolver.delete(uri, "display_name=?", new String[] { str });// 从raw_contacts表中删除   
    uri = Uri.parse("content://com.android.contacts/data");   
    resolver.delete(uri, "raw_contact_id=?",   
      new String[] { id + "" });// 从data表中删除   
   }   
}   
}   
// 更新电话号码   
public void UpdateContact(Context context, String name, String phone)   
   throws Exception {   
//int id = 0;   
//Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");   
ContentResolver resolver = context.getContentResolver();   
//Cursor cursor = resolver.query(uri, new String[] { Data._ID },   
//"display_name=?", new String[] { name }, null);   
Uri uri = Uri.parse("content://com.android.contacts/data");// 对data表的所有数据操作   
ContentValues values = new ContentValues();   
values.put("data2", "2");   
values.put("data1", phone);   
/*   
if (cursor.moveToFirst()) {   
   id = cursor.getInt(0);   
   Log.i(tag, "update id:" + id);   
}   
*/   
//resolver.update(uri, values, "mimetype=? and raw_contact_id=?",   
//new String[] { "vnd.android.cursor.item/phone_v2", id + "" });   
resolver.update(uri, values, "mimetype=? and display_name=?",   
    new String[] { "vnd.android.cursor.item/phone_v2", name });   
   
}   
public static void main(String[] args) {   
}   
}   
   
</i
页: [1]
查看完整版本: 对通讯录的各项操作,完整版,经过测试,方便后来者