1.回顾
上篇学习了 安卓的 文件存储 ,包括 存储在 sd卡上;
2.重点
(1)了解 四大组件之一 Content Provider
(2)实现 查询通信录中 联系人
(3)实现 新增联系人到通信录
3.介绍
(1) ContentProvider相对于其它的方式比较复杂,当然其功能相对于其它的方式也是革命性的改变。
(2)它能够实现跨应用之间的数据操作。
(3)利用ContentResolver对象的delete、update、insert、query等方法去操作 ContentProvider的对象,
(4)让 ContentProvider对象的方法去对数据操作。
4.例子
——调用通信录实现 联系人的查询和添加——
4.1 效果图
4.2 添加权限
在 AndroidMainfest.xml 文件中添加 ,读取联系人和添加联系人的权限
<uses-permission android:name="android.permission.READ_CONTACTS"/> <uses-permission android:name="android.permission.WRITE_CONTACTS"/>
4.3 查询联系人实现
/* * 查询联系人 */ private void selectContact(){ /** * 使用ContentResolver 实现 这个和 ContentProvider 的参数 一模一样 * * 联系人的 URI 提供: ContactsContract.Contacts.CONTENT_URI */ // 查询联系人 ContentResolver resolver = getContentResolver(); Cursor cursor = resolver.query(Contacts.CONTENT_URI, new String[] {Contacts._ID,Contacts.DISPLAY_NAME}, null, null, null); String str = "联系人:\n"; if (cursor != null) { while (cursor.moveToNext()) { String id=cursor.getString(cursor.getColumnIndex(Contacts._ID)); String name=cursor.getString(cursor.getColumnIndex(Contacts.DISPLAY_NAME)); str+=" id="+id+" name="+name; //通过id 查询 电话 Cursor c=resolver.query(Phone.CONTENT_URI,new String[]{Phone.NUMBER,Phone.TYPE},Phone.CONTACT_ID+"=?",new String[]{id},null); if(c!=null){ while(c.moveToNext()){ String num=c.getString(c.getColumnIndex(Phone.NUMBER)); String type=c.getString(c.getColumnIndex(Phone.TYPE)); str+=" num="+num+" type="+type; } c.close(); } str+="\n"; } cursor.close(); } tv_show.setText(str); }
4.4 实现 添加 联系人
/** * 首先向RawContacts.CONTENT_URI执行一个空值插入,目的是获取系统返回的rawContactId * * 这是后面插入data表的数据,只有执行空值插入,才能使插入的联系人在通讯录里可见 */ public void testInsert(){ ContentValues values = new ContentValues(); //首先向RawContacts.CONTENT_URI执行一个空值插入,目的是获取系统返回的rawContactId Uri rawContactUri = this.getContentResolver().insert(RawContacts.CONTENT_URI, values); long rawContactId = ContentUris.parseId(rawContactUri); //往data表入姓名数据 values.clear(); values.put(Data.RAW_CONTACT_ID, rawContactId); values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE); values.put(StructuredName.GIVEN_NAME, "我是测试联系人"); this.getContentResolver().insert( android.provider.ContactsContract.Data.CONTENT_URI, values); //往data表入电话数据 values.clear(); values.put(android.provider.ContactsContract.Contacts.Data.RAW_CONTACT_ID, rawContactId); values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE); values.put(Phone.NUMBER, "10000000010001"); values.put(Phone.TYPE, Phone.TYPE_MOBILE); this.getContentResolver().insert( android.provider.ContactsContract.Data.CONTENT_URI, values); //往data表入Email数据 values.clear(); values.put(android.provider.ContactsContract.Contacts.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_WORK); this.getContentResolver().insert( android.provider.ContactsContract.Data.CONTENT_URI, values); }
5.总结
(1) 在和通信录打交道 ,不要忘记 添加权限 ;
(2)Content Provider 实现跨应用之间的数据操作;
6.demo 免积分下载
http://download.csdn.net/detail/lablenet/9055113
版权声明:本文为博主原创文章,未经博主允许不得转载。