有時應用開發須要訪問通信錄,對手機通信錄進行讀寫操做。這時就須要用到ContentProvider。java
咱們經過一個小的案例來學習如何實現此功能。android
package cn.meng.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.test.AndroidTestCase; import android.util.Log; public class ContactsTest extends AndroidTestCase{ private static final String TAG = "ContactsTest"; //獲取全部聯繫人 public void testContacts(){ Uri uri = Uri.parse("content://com.android.contacts/contacts"); //得到ContentResolver ContentResolver resolver = this.getContext().getContentResolver(); Cursor cursor = resolver.query(uri, new String[]{"_id"}, null, null, null); while(cursor.moveToNext()){ int contactsId = cursor.getInt(0); //訪問某個聯繫人下的全部數據 uri = Uri.parse("content://com.android.contacts/contacts/" + contactsId + "/data"); StringBuilder sb = new StringBuilder("contactsId="+contactsId); Cursor datacursor = resolver.query(uri, new String[]{"mimetype","data1","data2"}, null, null, null); while(datacursor.moveToNext()){ String data = datacursor.getString(datacursor.getColumnIndex("data1")); String type = datacursor.getString(datacursor.getColumnIndex("mimetype")); if("vnd.android.cursor.item/name".equals(type)){ //姓名 sb.append(",name="+data); }else if("vnd.android.cursor.item/email_v2".equals(type)){ //郵件 sb.append(",email="+data); }else if("vnd.android.cursor.item/phone_v2".equals(type)){ //電話 sb.append(",phone="+data); } } Log.i(TAG, sb.toString()); } } //根據號碼查找聯繫人的姓名 public void testContactNameByPhone(){ String phoneNum = "5633288"; Uri uri = Uri.parse("content://com.android.contacts/data/phones/filter/"+phoneNum); //得到ContentResolver ContentResolver resolver = this.getContext().getContentResolver(); Cursor cursor = resolver.query(uri, new String[]{"display_name"}, null, null, null); while(cursor.moveToNext()){ String name = cursor.getString(0); Log.i(TAG, name); } cursor.close(); } //向通信錄中添加聯繫人,此步驟是分開的,若是有部分錯誤,錯誤的添加不進去,不影響其餘,有弊端 public void testAddContact()throws Exception{ //向raw_contacts表中添加數據 Uri uri = Uri.parse("content://com.android.contacts/raw_contacts"); //得到ContentResolver ContentResolver resolver = this.getContext().getContentResolver(); long contactsId = ContentUris.parseId(resolver.insert(uri, new ContentValues())); //向data表中添加數據 uri = Uri.parse("content://com.android.contacts/data"); ContentValues values = new ContentValues(); values.put("raw_contact_id", contactsId); values.put("mimetype", "vnd.android.cursor.item/name");//姓名 values.put("data2", "大大"); resolver.insert(uri,values); values.clear(); values.put("raw_contact_id", contactsId); values.put("mimetype", "vnd.android.cursor.item/phone_v2");//電話 values.put("data1", "13831056895"); values.put("data2", "2"); resolver.insert(uri,values); values.clear(); values.put("raw_contact_id", contactsId); values.put("mimetype", "vnd.android.cursor.item/email_v2");//郵箱 values.put("data1", "138@qq.com"); values.put("data2", "1"); resolver.insert(uri,values); } //向通信錄中添加聯繫人,總體做爲一個步驟,有部分出錯,就添加不進去聯繫人信息 public void testAddContact2()throws Exception{ //向raw_contacts表中添加數據 Uri uri = Uri.parse("content://com.android.contacts/raw_contacts"); //得到ContentResolver ContentResolver resolver = this.getContext().getContentResolver(); ArrayList<ContentProviderOperation> operations = new ArrayList<ContentProviderOperation>(); ContentProviderOperation op1 = ContentProviderOperation.newInsert(uri) .withValue("account_name", null).build(); operations.add(op1); //向data表中添加數據 uri = Uri.parse("content://com.android.contacts/data"); //0指的是operations集合下標爲0的第一個元素,得到Id ContentProviderOperation op2 = ContentProviderOperation.newInsert(uri) .withValueBackReference("raw_contact_id", 0) .withValue("mimetype", "vnd.android.cursor.item/name") .withValue("data2", "小小") .build(); operations.add(op2); ContentProviderOperation op3 = ContentProviderOperation.newInsert(uri) .withValueBackReference("raw_contact_id", 0) .withValue("mimetype", "vnd.android.cursor.item/phone_v2") .withValue("data1", "13523568963") .withValue("data2", "2") .build(); operations.add(op3); ContentProviderOperation op4 = ContentProviderOperation.newInsert(uri) .withValueBackReference("raw_contact_id", 0) .withValue("mimetype", "vnd.android.cursor.item/email_v2") .withValue("data1", "45623789@126.com") .withValue("data2", "1") .build(); operations.add(op4); resolver.applyBatch("com.android.contacts", operations); } }
項目清單配置以下:app
<?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="cn.meng.contacts" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="14" /> <!-- 申請讀寫權限 --> <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name="android.permission.WRITE_CONTACTS" /> <application android:icon="@drawable/ic_launcher" android:label="@string/app_name" > <activity android:label="@string/app_name" android:name=".MainActivity" > <intent-filter > <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> <!-- 單元測試 --> <uses-library android:name="android.test.runner"/> </application> <!-- 單元測試 --> <instrumentation android:name="android.test.InstrumentationTestRunner" android:targetPackage="cn.meng.contacts"></instrumentation> </manifest>