[每天學點Android開發]使用新的Contacts API (ContactsContract)讀取連絡人資訊

來源:互聯網
上載者:User

今日學習任務:實現讀取手機中所有連絡人的主要資訊(名稱和聯絡電話),並以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

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.