天天看點

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();