package cn.test;import java.util.ArrayList;import android.content.ContentProviderOperation;import android.content.ContentResolver;import android.content.ContentUris;import android.content.ContentValues;import android.database.Cursor;import android.net.Uri;import android.provider.ContactsContract;import android.provider.ContactsContract.CommonDataKinds.Email;import android.provider.ContactsContract.CommonDataKinds.Phone;import android.provider.ContactsContract.CommonDataKinds.StructuredName;import android.test.AndroidTestCase;import android.util.Log;public class TestContact extends AndroidTestCase {private static final String TAG = "TESTCONTACT";private ContentResolver contentResolver;// 訪問通訊錄中的所有連絡人public void testContacts() {contentResolver = this.getContext().getContentResolver();Uri allContactsUri = Uri.parse("content://com.android.contacts/contacts");Cursor allContactsCursor = contentResolver.query(allContactsUri, null,null, null, null);// 從contacts表中得到所有連絡人StringBuilder builder = new StringBuilder();while (allContactsCursor.moveToNext()) {int _id = allContactsCursor.getInt(allContactsCursor.getColumnIndex("_id"));builder.append("_id=" + _id).append(",");Uri perContactUri = Uri.parse("content://com.android.contacts/contacts/" + _id+ "/data");Cursor perContactsCursor = contentResolver.query(perContactUri,null, null, null, null);// 得到某個id在data表中的所有資料while (perContactsCursor.moveToNext()) {// 以下兩句涉及到關聯查詢 data表和mimetype表進行 String data1 = perContactsCursor.getString(perContactsCursor.getColumnIndex("data1"));// 得到每個連絡人的每個data1String mimetype = perContactsCursor.getString(perContactsCursor.getColumnIndex("mimetype"));//判斷此data1到底是什麼含義if ("vnd.android.cursor.item/phone_v2".equals(mimetype)) {builder.append("phone=").append(data1).append(",");} else if ("vnd.android.cursor.item/email_v2".equals(mimetype)) {builder.append("email=").append(data1).append(",");} else if ("vnd.android.cursor.item/name".equals(mimetype)) {builder.append("name=").append(data1).append(",");}}perContactsCursor.close();}allContactsCursor.close();Log.i(TAG, builder.toString());}//根據電話號碼查詢出連絡人的姓名public void getNameByTele(){contentResolver = this.getContext().getContentResolver();Uri teleUri = Uri.parse("content://com.android.contacts/data/phones/filter/12345");// 以下兩句涉及到關聯查詢 data表和raw_contacts表 //Cursor oneContactCursor = contentResolver.query(teleUri, null,null, null, null);//name=oneContactCursor.getString(oneContactCursor.getColumnIndex("display_name"));Cursor oneContactCursor = contentResolver.query(teleUri, null,null, null, null);String name="";while(oneContactCursor.moveToNext()){name=oneContactCursor.getString(oneContactCursor.getColumnIndex("display_name"));}Log.i(TAG,name);}//向通訊錄中新增連絡人...//首先是更新raw_contacts表,表中有一個_id,然後再更新data表,把詳細的資訊放在此表中//並不是先更新data表後更新raw_contacts表.因為data表中有一個外鍵raw_contact_id與表Raw_contacts的主鍵_id是一致的//raw_contacts表中除了_id以外,其實都是在data表更新後才更新的.//第一步:我們向raw_contacts表中添加一條空的資料即可.為了得到其自動成長的主鍵_id//第二步:更新data表中的資料//somebody's codepublic void testAddContact1() {//以下為第一步Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");ContentResolver resolver = this.getContext().getContentResolver();ContentValues values = new ContentValues();Uri insertUri = resolver.insert(uri, values);long contactid = ContentUris.parseId(insertUri);//以下為第二步values.clear();values.put("raw_contact_id", contactid);values.put(ContactsContract.Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);values.put(StructuredName.GIVEN_NAME, "張三");uri = Uri.parse("content://com.android.contacts/data");resolver.insert(uri, values);values.clear();values.put("raw_contact_id", contactid);values.put(ContactsContract.Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);values.put(Phone.NUMBER, "1386595955");values.put(Phone.TYPE, Phone.TYPE_MOBILE);uri = Uri.parse("content://com.android.contacts/data");resolver.insert(uri, values);values.clear();values.put("raw_contact_id", contactid);values.put(ContactsContract.Data.MIMETYPE, Email.CONTENT_ITEM_TYPE);values.put(Email.DATA, "test@sina.com");values.put(Email.TYPE, Email.TYPE_HOME);uri = Uri.parse("content://com.android.contacts/data");resolver.insert(uri, values);}//多個操作在同一個事務中執行//要求對以上的幾個操作用事務進行管理//somebody's codepublic void testAddContact2() throws Exception{Uri uri = Uri.parse("content://com.android.contacts/raw_contacts");ContentResolver resolver = this.getContext().getContentResolver();ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>();ContentProviderOperation rawcontactOperation = ContentProviderOperation.newInsert(uri).withValue("account_name", null).build();operations.add(rawcontactOperation);uri = Uri.parse("content://com.android.contacts/data");ContentProviderOperation dataOperation = ContentProviderOperation.newInsert(uri).withValueBackReference("raw_contact_id", 0).withValue("mimetype", "vnd.android.cursor.item/name").withValue("data2", "李白").build();operations.add(dataOperation);uri = Uri.parse("content://com.android.contacts/data");dataOperation = ContentProviderOperation.newInsert(uri).withValueBackReference("raw_contact_id", 0).withValue("mimetype", "vnd.android.cursor.item/phone_v2").withValue("data1", "1386595955").withValue("data2", Phone.TYPE_MOBILE).build();operations.add(dataOperation);uri = Uri.parse("content://com.android.contacts/data");dataOperation = ContentProviderOperation.newInsert(uri).withValueBackReference("raw_contact_id", 0).withValue("mimetype", "vnd.android.cursor.item/email_v2").withValue("data1", "test@sina.com").withValue("data2", Email.TYPE_HOME).build();operations.add(dataOperation);resolver.applyBatch("com.android.contacts", operations);}}