[每天学点Android开发]使用新的Contacts API (ContactsContract)读取联系人信息

今日学习任务:实现读取手机中所有联系人的主要信息(名称和联系电话),并以ListView显示

涉及的主要内容:1) Contact API的结构和使用方法  2) ContentProvider组件作用,URI概念及使用方法  3)创建ListView,并绑定数据 

 

1. Contact API的结构和使用方法

  自Android 2.0(API Level 5)开始,Android平台采用了改进后的Contacts API- ContactsContract,用于管理和集成来自多账户和多数据来源的联系人信息。

  在新的Contacts API中,联系人数据被安排三个主要的表中:contacts, raw contacts and data. 结构如下图所示:

   

                   (图片来源于:developer.android.com)

  1) Contact 表中的一行记录代表一个联系人的总体信息

  2) RawContact表的一行记录用于关联联系人和一个特定的联系人信息来源。因为有可能手机的联系人信息是来源于Gmail,Facebook等其它地方,为互相区别并方便同步,特引入RawContact概念。

  3) Data表:储存所有具体的信息,如:电话,email地址, 头像等。表的每一条记录对应一个RawContact的一个具体信息。

  总的来说就是:一个contact(联系人)记录关联一个或多个RawContact(联系人来源)记录,每个RawContact记录又关联多个data(email, phone number等等)记录。 

  参考1:http://developer.android.com/resources/articles/contacts.html  

  参考2:http://www.haoni.org/2011/04/15/androidcontactscontractyanjiu/ 

2. ContentProvider组件作用,URI概念及使用方法

  在Android中,应用程序之间是相互独立的,分别运行在自己的进程中。如果应用程序之间想互相共享数据怎么办?比如,当我们发送一条短信时,可能要用到联系人应用程序,从中选择要接受短信的人。在这种情况下,Android提供了应用程序之间互相访问的统一接口,这些接口被定义在ContentProvider中,其中包括增,删,查,改等操作。

  我们在ContentProvider中实现我们实际操作数据的方法。但调用时,我们将使用另外一个接口:ContentResolver。ContentResolver提供了和ContentProvider对应的方法。我们是间接地通过ContentResolver来操作ContentProvider的。ContentResolver可以通过getContentResolver()方法获得。 

  URI的讲解: 可以参考http://www.cnblogs.com/thomas-lee/archive/2011/04/16/Android3.html 的相关部分以及官方文档上的相关部分,比如:

 http://developer.android.com/guide/topics/providers/content-providers.html#creating中的最后一部分。

TextUtils

 

  这部分参考:《Android应用开发详解》 郭宏志,电子工业出版社

3.  创建ListView,并绑定数据

  参考:http://developer.android.com/resources/tutorials/views/hello-listview.html 

4. 最终代码如下:

package  com.memo;
import  java.util.ArrayList;
import  android.app.ListActivity;
import  android.database.Cursor;
import  android.net.Uri;
import  android.os.Bundle;
import  android.provider.ContactsContract;
import  android.widget.ArrayAdapter;
import  android.widget.ListView;

public   class  Main  extends  ListActivity {
    
    
/**  Called when the activity is first created.  */
    @Override
    
public   void  onCreate(Bundle savedInstanceState) {
        
super .onCreate(savedInstanceState);
        
        Uri contactsUri
= ContactsContract.Contacts.CONTENT_URI;
        String[] proj1
= new  String[]{ContactsContract.Contacts.DISPLAY_NAME,
                                    ContactsContract.Contacts.HAS_PHONE_NUMBER,
                                    ContactsContract.Contacts.LOOKUP_KEY};
        Cursor curContacts
= getContentResolver().query(contactsUri,proj1,  null null null );
           
        
// declare a ArrayList object to store the data that will present to the user
        ArrayList < String >  contactsList = new  ArrayList < String > (); 
        String allPhoneNo
= "" ;
        
if (curContacts.getCount() > 0 ){
            
while (curContacts.moveToNext()){   
                
//  get all the phone numbers if exist
                 if (curContacts.getInt( 1 ) > 0 ){
                    allPhoneNo
= getAllPhoneNumbers(curContacts.getString( 2 ));
                }
                contactsList.add(curContacts.getString(
0 ) + "  ,  " + allPhoneNo);
                allPhoneNo
= "" ;
            }
        }
   
        
//  binding the data to ListView 
        setListAdapter( new  ArrayAdapter < String > ( this ,android.R.layout.simple_list_item_1, contactsList));
        ListView lv
= getListView();
        lv.setTextFilterEnabled(
true );
        
    }
    
    
/**
     * Get all the phone numbers of a specific contact person
     * 
     * 
@param  lookUp_Key lookUp key for a specific contact
     * 
@return  a string containing all the phone numbers
     
*/
    
public  String getAllPhoneNumbers(String lookUp_Key){
        String allPhoneNo
= "" ;
        
        
//  Phone info are stored in the ContactsContract.Data table 
        Uri phoneUri = ContactsContract.CommonDataKinds.Phone.CONTENT_URI;
        String[] proj2
= {ContactsContract.CommonDataKinds.Phone.NUMBER};
        
//  using lookUp key to search the phone numbers
        String selection = ContactsContract.Data.LOOKUP_KEY + " =? " ;
        String[] selectionArgs
= {lookUp_Key};
        Cursor cur
= getContentResolver().query(phoneUri,proj2,selection, selectionArgs,  null );
        
while (cur.moveToNext()){
            allPhoneNo
+= cur.getString( 0 ) + "   " ;
        }

        
return  allPhoneNo;
        
    }
    

} 

5. 注意事项:

  1)由于要读取联系人信息,所以必须在AndroidMenifest.xml里加入相关uses-permission用于请求使用许可:

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

      参考1:http://developer.android.com/guide/topics/security/security.html 

      参考2:http://www.higherpass.com/Android/Tutorials/Working-With-Android-Contacts/

  2) 怎样获取特定联系人的电话号码?由于使用新的API,所以编写方法与使用旧的API不同。

      在查询是主要使用到lookUp key 的概念。 

      参考:http://stackoverflow.com/questions/4729551/contactscontract-lookup-phone-number-by-contact-id

转载于:https://www.cnblogs.com/ruiyi1987/archive/2011/06/20/2084925.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值