Android中通过ContentProvider和ContentResolver对通讯录的读取与操作
16lz
2021-01-23
Android开发中用得较多的一项功能,具体示例代码如下:
import java.util.ArrayList;import android.content.ContentProviderOperation;import android.content.ContentProviderResult;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.provider.ContactsContract.Data;import android.provider.ContactsContract.RawContacts;import android.test.AndroidTestCase;import android.util.Log;public class ContactTest extends AndroidTestCase {private final static String TAG = "ContactTest" ;//通过ContentResolver得到通讯录信息public void testGetContactAll() throws Exception{StringBuilder sb = new StringBuilder() ;//得到通讯录的内容提供者的URIUri uri = ContactsContract.Contacts.CONTENT_URI ;ContentResolver provider = this.getContext().getContentResolver() ;//通过内容提供者查询得到通讯录联系人基本信息列表Cursor cursor = provider.query(uri, null, null, null, null) ;while(cursor.moveToNext()){sb.delete(0, sb.length()) ;//联系人主键IDString contactId = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID)) ;String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME)) ;sb.append("contact_id=");sb.append(contactId);sb.append(",name=") ;sb.append(name) ;//根据联系人主键得到所有电话号码Cursor phoneCursor = provider.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID+"="+contactId, null, null) ;while(phoneCursor.moveToNext()){ String phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER)) ; sb.append(",number=") ;sb.append(phoneNumber) ;}phoneCursor.close() ;//根据联系人主键得到所有EmailCursor emailCursor = provider.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI, null, ContactsContract.CommonDataKinds.Email.CONTACT_ID+"="+contactId, null, null) ;while(emailCursor.moveToNext()){ String phoneNumber = emailCursor.getString(emailCursor.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA)) ; sb.append(",email=") ;sb.append(phoneNumber) ;}emailCursor.close() ;}cursor.close() ;Log.i(TAG, sb.toString()) ;}/** * 常规思路添加通讯录(但各项添加均为单独的操作,不在同一事务中,一但插入失败,无法一起回滚) * @throws Exception */public void testInsertContact() throws Exception {ContentValues values = new ContentValues() ;//首先往主表增加一条空记录Uri rawContactUri = this.getContext().getContentResolver().insert(RawContacts.CONTENT_URI, values) ;//得到对应的主键IDlong rawContactId = ContentUris.parseId(rawContactUri) ;/** 开始往数据表中添加详细数据 **///姓名数据values.put(Data.RAW_CONTACT_ID, rawContactId) ;values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE) ; //内容类型为姓名类型values.put(StructuredName.DISPLAY_NAME, "firefly") ;this.getContext().getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values) ;//电话数据values.put(Data.RAW_CONTACT_ID, rawContactId) ;values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE) ; //内容类型 为手机号码类型values.put(Phone.NUMBER, "13800138000") ;values.put(Phone.TYPE, Phone.TYPE_HOME) ;this.getContext().getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values) ;//Email数据values.put(Data.RAW_CONTACT_ID, rawContactId) ;values.put(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE) ; //内容类型 为手机号码类型values.put(Email.DATA, "[email protected]") ;values.put(Email.TYPE, Email.TYPE_HOME) ;this.getContext().getContentResolver().insert(android.provider.ContactsContract.Data.CONTENT_URI, values) ;}/** * Android提供的方法进行数据插入操作(在同一事务中,失败则一起回滚) * @throws Exception */public void testInsertContact2() throws Exception {/** 文档:reference/android/provider/ContactsContract.RawContacts.html **/ArrayList ops = new ArrayList() ;int rawContactInsertIndex = ops.size() ;//主表数据ops.add(ContentProviderOperation.newInsert(RawContacts.CONTENT_URI).withValue(RawContacts.ACCOUNT_TYPE, null).withValue(RawContacts.ACCOUNT_NAME, null).build()) ;/** 文档位置:reference/android/provider/ContactsContract.Data.html **///姓名数据ops.add(ContentProviderOperation.newInsert(android.provider.ContactsContract.Data.CONTENT_URI).withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex) //如果是0,则表示后退引用前面插入的ID.withValue(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE).withValue(StructuredName.GIVEN_NAME, "sina").build()) ;//电话数据ops.add(ContentProviderOperation.newInsert(android.provider.ContactsContract.Data.CONTENT_URI).withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex).withValue(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE).withValue(Phone.NUMBER, "13800138001").withValue(Phone.TYPE, Phone.TYPE_HOME).withValue(Phone.LABEL, "home mobile").build()) ;//Email数据ops.add(ContentProviderOperation.newInsert(android.provider.ContactsContract.Data.CONTENT_URI).withValueBackReference(Data.RAW_CONTACT_ID, rawContactInsertIndex).withValue(Data.MIMETYPE, Email.CONTENT_ITEM_TYPE).withValue(Email.DATA, "[email protected]").withValue(Email.TYPE, Email.TYPE_WORK).withValue(Email.LABEL, "home email").build()) ;ContentProviderResult[] results = this.getContext().getContentResolver().applyBatch(ContactsContract.AUTHORITY, ops) ;for(ContentProviderResult result : results){Log.i(TAG, result.uri.toString()) ;}}}
其他update、delete操作参见文档示例。
对通讯录进行读写操作需要在项目功能清单中配置相关权限:
更多相关文章
- Android 中的Intent在两个Acitvity传递数据示例
- 数据库判断是否为某一个值时sql
- Android学习--动态向SPinner控件中添加数据
- android简单登陆和注册功能实现+SQLite数据库学习
- Android数据库升级解决方案
- Android中SQLite数据库中query或者rawquery查询失败闪退问题
- Android中SQLite数据库操作(2)——使用SQLiteDatabase提供的方法操
- Android使用HttpURLConnection请求网络返回JSON数据并解析
- 【Android】数据库处理