zoukankan      html  css  js  c++  java
  • 通过ContentResolver调用系统URI实现的通讯录示例

    转自:http://blog.csdn.net/sadfishsc/article/details/7406327

    Android的四大组件之一,ContentProvider,分为两个部分:一是数据组织工具ContentProvider,一是数据调用工具ContentResolver。对于系统已经提供的URI,如通讯录、多媒体、短信等,通常可以不需要再建立额外的数据库,再用ContentProvider进行组织,而是可以直接用ContentResolver调用这些URI,对系统数据库进行增删改查等操作,从而保证整个Android设备中数据的统一。

    下面这个链接是本人前段时间为了参加MM论坛的一个小比赛所做的通讯录小demo的源码。因为最近工作和生活的一些原因,把比赛的截止日期给耽误了,所以到最后也没做美工。

    http://download.csdn.net/detail/sadfishsc/4182452

    对通讯录URI的分析主要参考的是雨松MOMO的博文:

    http://blog.csdn.net/xys289187120/article/details/6730957

    如下是对通讯录表进行添加和删除的处理类ContactHandler:

     

    1. import android.content.ContentResolver;  
    2. import android.content.ContentUris;  
    3. import android.content.ContentValues;  
    4. import android.content.Context;  
    5. import android.provider.ContactsContract.Data;  
    6. import android.provider.ContactsContract.RawContacts;  
    7. import android.provider.ContactsContract.CommonDataKinds.Phone;  
    8. import android.provider.ContactsContract.CommonDataKinds.StructuredName;  
    9.   
    10. public class ContactHandler {  
    11.     private Context context;  
    12.       
    13.     public ContactHandler(Context context) {  
    14.         this.context = context;  
    15.     }  
    16.       
    17.     public void create(ContactItem item) {  
    18.         ContentResolver resolver = context.getContentResolver();  
    19.         ContentValues values = new ContentValues();  
    20.           
    21.         long rawContactId = ContentUris.parseId(resolver.insert(RawContacts.CONTENT_URI, values));  
    22.           
    23.         values.clear();  
    24.         values.put(Data.RAW_CONTACT_ID, rawContactId);  
    25.         values.put(Data.MIMETYPE, StructuredName.CONTENT_ITEM_TYPE);  
    26.         values.put(StructuredName.DISPLAY_NAME, item.getValue(ContactItem.TYPE_NAME));  
    27.         resolver.insert(Data.CONTENT_URI, values);  
    28.           
    29.         values.clear();  
    30.         values.put(Data.RAW_CONTACT_ID, rawContactId);  
    31.         values.put(Data.MIMETYPE, Phone.CONTENT_ITEM_TYPE);  
    32.         values.put(Phone.NUMBER, item.getValue(ContactItem.TYPE_PHONE));  
    33.         values.put(Phone.TYPE, Phone.TYPE_MOBILE);  
    34.         resolver.insert(Data.CONTENT_URI, values);  
    35.     }  
    36.       
    37.     public void delete(ContactItem item) {  
    38.         ContentResolver resolver = context.getContentResolver();  
    39.           
    40.         String[] args = {item.getValue(ContactItem.TYPE_CONTACT_ID)};  
    41.           
    42.         resolver.delete(RawContacts.CONTENT_URI, Data.CONTACT_ID + "=?", args);  
    43.         resolver.delete(Data.CONTENT_URI, Data.RAW_CONTACT_ID + "=?", args);  
    44.     }  
    45. }  

    如下是一次性获取通讯录列表信息的类ContractGenerator:

     

    1. import java.io.InputStream;  
    2. import java.util.ArrayList;  
    3. import java.util.List;  
    4.   
    5. import android.content.ContentResolver;  
    6. import android.content.ContentUris;  
    7. import android.content.Context;  
    8. import android.database.Cursor;  
    9. import android.graphics.Bitmap;  
    10. import android.graphics.BitmapFactory;  
    11. import android.net.Uri;  
    12. import android.provider.ContactsContract.Contacts;  
    13. import android.provider.ContactsContract.CommonDataKinds.Phone;  
    14. import android.provider.ContactsContract.CommonDataKinds.Photo;  
    15.   
    16. public class ContactGenerator {  
    17.     private Context context;  
    18.       
    19.     private static final String[] PROJECTECTION = {  
    20.         Phone.DISPLAY_NAME,  
    21.         Phone.NUMBER,  
    22.         Photo.PHOTO_ID,  
    23.         Phone.CONTACT_ID,  
    24.     };  
    25.     private static final int DISPLAY_NAME_INDEX = 0;  
    26.     private static final int PHONE_NUMBER_INDEX = 1;  
    27.     private static final int PHOTO_ID_INDEX = 2;  
    28.     private static final int CONTACT_ID_INDEX = 3;  
    29.       
    30.     public ContactGenerator(Context context) {  
    31.         this.context = context;  
    32.     }  
    33.       
    34.     public List<ContactItem> generateList() {  
    35.         List<ContactItem> list = new ArrayList<ContactItem>();  
    36.           
    37.         ContentResolver resolver = context.getContentResolver();  
    38.         Cursor cursor = resolver.query(Phone.CONTENT_URI, PROJECTECTION, nullnull,  PROJECTECTION[DISPLAY_NAME_INDEX] + " ASC");  
    39.         while (cursor.moveToNext()) {  
    40.             String name = cursor.getString(DISPLAY_NAME_INDEX);  
    41.             String phone = cursor.getString(PHONE_NUMBER_INDEX);  
    42.             long photoId = cursor.getLong(PHOTO_ID_INDEX);  
    43.             long contactId = cursor.getLong(CONTACT_ID_INDEX);  
    44.               
    45.             Bitmap head = null;  
    46.             if (photoId > 0) {  
    47.                 Uri uri = ContentUris.withAppendedId(Contacts.CONTENT_URI, contactId);  
    48.                 InputStream input = Contacts.openContactPhotoInputStream(resolver, uri);  
    49.                 head = BitmapFactory.decodeStream(input);  
    50.             }  
    51.               
    52.             ContactItem item = new ContactItem(context, name, phone, head);  
    53.             item.setContactId(contactId);  
    54.             list.add(item);  
    55.         }  
    56.           
    57.         return list;  
    58.     }  
    59. }  

    对系统通讯录数据库进行操作,需要在AndroidManifest.xml文件中添加如下两个用户权限:

     

    1. <uses-permission android:name="android.permission.READ_CONTACTS"></uses-permission>  
    2. <uses-permission android:name="android.permission.WRITE_CONTACTS"></uses-permission>  

    对于ContentResolver的使用,主要是如下几个步骤:

    1.      通过Context的getContentResolver()方法获取ContentResolver实例;

    2.      调用ContentResolver的insert、delete、update、query方法对数据表进行增删改查操作,对数据表的指定是通过系统URI来完成,这些URI会作为参数传入上述4个方法中。详情参见Android API文档。

    另外,如下的博文分享了包括通讯录、多媒体、短信在内的系统URI:

    http://blog.csdn.net/lyx2007825/article/details/7280043

    就本文中的示例而言,Java源码文件如下图:

    除了前述两个对ContentResolver的操作外,本通讯录的UI控件主要基于二级列表ExpandableListView,所以有继承自BaseExpandableListAdapter的二级列表数据处理适配器类ContactAdapter。另外,ContactItem是数据实体类。其余两个Activity类的界面类。

    最后需要说明的是,对于系统已经提供了URI的数据资源,没有必要再用ContentProvider对其进行封装管理,因而本示例中并没有用到ContentProvider,只用到ContentResolver。

  • 相关阅读:
    Java NIO使用及原理分析(三) 分类: Java 2014-03-12 17:56 447人阅读 评论(0) 收藏
    Java NIO使用及原理分析(二) 分类: Java 2014-03-12 17:55 465人阅读 评论(0) 收藏
    Java NIO使用及原理分析 ( 一 ) 分类: Java 2014-03-12 17:52 637人阅读 评论(0) 收藏
    网络编程中的Socket详解---Socket重要参数详解 分类: Android 2014-03-11 16:25 2066人阅读 评论(0) 收藏
    网络编程中的Socket详解---Socket编程实践详解 分类: Java 2014-03-11 16:19 549人阅读 评论(0) 收藏
    网络编程中的Socket详解---Delayed Ack(Ack确认延迟) && Nagle Algorithm(纳格算法) 分类: Java 2014-03-11 15:46 2316人阅读 评论(0) 收藏
    关于ThreadLocal的一道面试题(酷我公司) 分类: Android 2014-03-04 11:33 2124人阅读 评论(5) 收藏
    Java中的并发库学习总结 分类: Java 2014-03-03 15:12 3115人阅读 评论(3) 收藏
    深入解析Java中volatile关键字的作用 分类: Java 2014-03-03 13:47 1441人阅读 评论(3) 收藏
    Android源码的git下载地址 分类: Android 2014-02-27 15:26 1111人阅读 评论(0) 收藏
  • 原文地址:https://www.cnblogs.com/wangpei/p/2977548.html
Copyright © 2011-2022 走看看