天天看点

Android Contacts的使用(一)

学习使用Android联系人数据库。要求懂得基本的SQLite的知识。可以查看 Android SQLite and Cursor Article相关文章以获取更多信息。从Android 1.x 至 2.0 版本谷歌改变了Android的联系人数据库。该手册主要分为三个部分:一是介绍2.0中访问名片夹;二是介绍1.6之前的版本;三我们综合了为每个版本给出一个抽象类和累积来管理名片记录数据。

[size=x-small][b]Android Contact API For 2.0[/b][/size]

[b]Granting Access 授予权限[/b]

AndroidManifest.xml文件中授予以下权限

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

[b]

Querying The Android Contact Database 联系人数据库查询[/b]

基本的个人信息存储在名片夹表,而详细的存储在个人表里。在Andoid2.0中查询相应联系记录的URI是ContactsContract.Contacts.CONTENT_URI。

package com.test;import android.app.Activity;
import android.database.Cursor;import android.os.Bundle;
import android.provider.ContactsContract;
import android.provider.ContactsContract.Contacts;
public class TestContacts extends Activity {        
   @Override    public void onCreate(Bundle savedInstanceState){        
         super.onCreate(savedInstanceState);        
         setContentView(R.layout.main);     
           ContentResolver cr = getContentResolver();
         Cursor cursor = cr.query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);//查询通讯录        
           if(cursor.getCount()>0){            
             while (cursor.moveToNext()) { 
                String id = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts._ID));//联系人id               
                String name = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));//联系人名称                
                   if(cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER))>0)                       {                    //Query phone here.  Covered next 在该处查询电话号码                
                                }            
            }        
           }    
 }
}
           

启动该应用程序时需关闭任何其他Android应用程序。首先,创建一个ContentResolver的实例cr。然后使用ContentResolver的实例查询数据库并返回联系人列表游标。该查询是针对ContactsContract.Contacts.CONTENT_URI 进行存储的URI。下一步检查游标是否包含记录,如果包含记录,侧记录ID字段的值存储在ID变量中。他将作为一个参数在后面的地方使用。也把名称字段的值存储在name变量中。对于游标的更多详细用法可以查看 Android的游标教程 。

[b]Phone Numbers 电话号码[/b]

电话号码存储在它们自己的表中,需要单独进行查询。要查询的电话号码表使用的是SDK中的变量ContactsContract.CommonDataKinds.Phone.CONTENT_URI存储的URI。使用WHERE条件得到指定联系人的电话号码。

//根据ID查询出电话号码                    
Cursor pCur = cr.query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI, null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID +" = ?", new String[]{id}, null);                    
    while (pCur.moveToNext()) {                         
               // Do something with  phones                     
     }                      
      pCur.close();
           

在Android联系人SQLite数据库中执行第二个查询。查询的电话号码是针对ContactsContract.CommonDataKinds.Phone.CONTENT_URI存储的URI。CONTACT_ID存储在电话表中,ContactsContract.CommonDataKinds.Phone.CONTACT_ID和where子句用于限制返回的数据。

[b]Email Addresses 电子邮件地址[/b]

Cursor emailCur = cr.query(ContactsContract.CommonDataKinds.Email.CONTENT_URI,null, ContactsContract.CommonDataKinds.Email.CONTACT_ID + " = ?", new String[]{id}, null);

while (emailCur.moveToNext()) {

//如果email地址被保存在一个数组中,你将得到多个邮件地址 String email =

emailCur.getString(emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.DATA));                          String emailType = emailCur.getString(emailCur.getColumnIndex(ContactsContract.CommonDataKinds.Email.TYPE));                       }                       emailCur.close();
           
Notes 注释
           

[b]Postal Addresses 邮政地址[/b]

String addrWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; 
                    String[] addrWhereParams = new String[]{id,ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_ITEM_TYPE};                    
 Cursor addrCur = cr.query(ContactsContract.Data.CONTENT_URI,null, addrWhere, addrWhereParams, null);  
                   while(addrCur.moveToNext()) {                        
       String poBox = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POBOX));                         String street = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.STREET));                         String city = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY));                         String region = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.REGION));                         String postalCode = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.POSTCODE));                         String country = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.COUNTRY));                         String type = addrCur.getString(addrCur.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.TYPE));                     }                      addrCur.close();
           

[b]Instant Messenger (IM) 即时消息[/b]

String imWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?";    
                  String[] imWhereParams = new String[]{id,ContactsContract.CommonDataKinds.Im.CONTENT_ITEM_TYPE};
                      Cursor imCur = cr.query(ContactsContract.Data.CONTENT_URI,null, imWhere, imWhereParams, null);                     
      if (imCur.moveToFirst()) {                         
         String imName = imCur.getString(imCur.getColumnIndex(ContactsContract.CommonDataKinds.Im.DATA));                                    String imType = imCur.getString(imCur.getColumnIndex(ContactsContract.CommonDataKinds.Im.TYPE));                     }                      imCur.close();
           

[b]Organizations 组织[/b]

String orgWhere = ContactsContract.Data.CONTACT_ID + " = ? AND " + ContactsContract.Data.MIMETYPE + " = ?"; 
                     String[] orgWhereParams = new String[]{id,ContactsContract.CommonDataKinds.Organization.CONTENT_ITEM_TYPE};                      Cursor orgCur = cr.query(ContactsContract.Data.CONTENT_URI,null, orgWhere, orgWhereParams, null);                     
if (orgCur.moveToFirst()) {                          
String orgName = orgCur.getString(orgCur.getColumnIndex(ContactsContract.CommonDataKinds.Organization.DATA));                         String title = orgCur.getString(orgCur.getColumnIndex(ContactsContract.CommonDataKinds.Organization.TITLE));                     }                      orgCur.close();