Android軟件開發之獲取通訊錄聯繫人信息

http://xys289187120.blog.51cto.com/3361352/656766


Android手機的通訊錄聯繫人全部都存在系統的數據庫中,如果須要獲得通訊裏聯繫人的信息就須要訪問系統的數據庫,才能將信息拿出來。 這一篇文章我主要帶領同學們熟悉Android的通訊錄機制。


圖中選中的數據庫 contacts2.db就是系統儲存聯繫人的數據庫,我們將它打開看看裏面儲存了些什麼東東? 如果對數據庫不太清楚的請查看我的博文Android遊戲開發之數據庫SQLite 詳細介紹(十七)
 

打開contacts.db後 發麪裏面有一堆表,同學們先別慌張。今天我們主要討論紅框內的4個比較常用的表,後期我在介紹其它表的使用。這裏說一下如果你想在真機上查看數據庫的話必需要先獲得root權限,否則無法查看。
 

 
1.contacts 表

_id :表的ID,主要用於其它表通過contacts 表中的ID可以查到相應的數據。
display_name: 聯繫人名稱
photo_id:頭像的ID,如果沒有設置聯繫人頭像,這個字段就爲空
times_contacted:通話記錄的次數
last_time_contacted: 最後的通話時間

lookup :是一個持久化的儲存 因爲用戶可能會改名子 但是它改不了lookup
 



2.data表
 

raw_contact_id:通過raw_contact_id可以找到 raw_contact表中相對的數據。

data1 到 data15 這裏保存着聯繫人的信息 聯繫人名稱 聯繫人電話號碼 電子郵件 備註 等等。


3.phone_look_up表


data_id : 通過data_id可以找到 datat表中相對的數據。
raw_contact_id : 通過raw_contact_id 可以找到 raw_contact_表中相對的數據。
normalized_number: 這個字段就比較有意思了,它是將每個電話號碼逆序排列。
 



4.raw_contact表


version :版本號,用於監聽變化
deleted :刪除標誌, 0爲默認 1 表示這行數據已經刪除
display_name : 聯繫人名稱
last_time_contacts : 最後聯繫的時間

 


有關這些的源碼都在android.provider.ContactsContract這個類裏面,如果想深入瞭解的話 可以去看看,數據庫相關的操作 聯查啊 啥的 都在裏面。


下面說說代碼是怎麼用的

先說說 Phone.CONTENT_URI,獲取聯繫人的時候需要去這個url中去找數據 。它所指向的其實是“content:// com.android.contacts/data/phones”。這個url 對應着contacts表 和 raw_contacts表 以及 data表 所以說我們的數據都是從這三個表中獲取的。


這裏強調一下query第二個參數

 

  1. private static final String[] PHONES_PROJECTION = new String[] {  
  2.        Phone.DISPLAY_NAME, Phone.NUMBER, Photo.PHOTO_ID,Phone.CONTACT_ID }; 


它的意思是隻去表中找 顯示名稱 電話號碼 頭像ID 聯繫人ID 這4個數據 ,如果你須要其它數據 的話 就須要修改這裏。


獲得手機通訊錄聯繫人信息

  1.    /**得到手機通訊錄聯繫人信息**/  
  2.    private void getPhoneContacts() {  
  3. ContentResolver resolver = mContext.getContentResolver();  
  4.  
  5. // 獲取手機聯繫人  
  6. Cursor phoneCursor = resolver.query(Phone.CONTENT_URI,PHONES_PROJECTION, null, null, null);  
  7.  
  8.  
  9. if (phoneCursor != null) {  
  10.     while (phoneCursor.moveToNext()) {  
  11.  
  12.     //得到手機號碼  
  13.     String phoneNumber = phoneCursor.getString(PHONES_NUMBER_INDEX);  
  14.     //當手機號碼爲空的或者爲空字段 跳過當前循環  
  15.     if (TextUtils.isEmpty(phoneNumber))  
  16.         continue;  
  17.       
  18.     //得到聯繫人名稱  
  19.     String contactName = phoneCursor.getString(PHONES_DISPLAY_NAME_INDEX);  
  20.       
  21.     //得到聯繫人ID  
  22.     Long contactid = phoneCursor.getLong(PHONES_CONTACT_ID_INDEX);  
  23.  
  24.     //得到聯繫人頭像ID  
  25.     Long photoid = phoneCursor.getLong(PHONES_PHOTO_ID_INDEX);  
  26.       
  27.     //得到聯繫人頭像Bitamp  
  28.     Bitmap contactPhoto = null;  
  29.  
  30.     //photoid 大於0 表示聯繫人有頭像 如果沒有給此人設置頭像則給他一個默認的  
  31.     if(photoid > 0 ) {  
  32.         Uri uri =ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI,contactid);  
  33.         InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(resolver, uri);  
  34.         contactPhoto = BitmapFactory.decodeStream(input);  
  35.     }else {  
  36.         contactPhoto = BitmapFactory.decodeResource(getResources(), R.drawable.contact_photo);  
  37.     }  
  38.       
  39.     mContactsName.add(contactName);  
  40.     mContactsNumber.add(phoneNumber);  
  41.     mContactsPhonto.add(contactPhoto);  
  42.     }  
  43.  
  44.     phoneCursor.close();  
  45. }  
  46.    } 



獲得手機sim卡聯繫人信息

sim卡和手機本人 獲取的方式類似 只是url有點不一樣 ,須要注意的一點是 sim卡 是沒有聯繫人頭像的。

 

  1.    /**得到手機SIM卡聯繫人人信息**/  
  2.    private void getSIMContacts() {  
  3. ContentResolver resolver = mContext.getContentResolver();  
  4. // 獲取Sims卡聯繫人  
  5. Uri uri = Uri.parse("content://icc/adn");  
  6. Cursor phoneCursor = resolver.query(uri, PHONES_PROJECTION, null, null,  
  7.     null);  
  8.  
  9. if (phoneCursor != null) {  
  10.     while (phoneCursor.moveToNext()) {  
  11.  
  12.     // 得到手機號碼  
  13.     String phoneNumber = phoneCursor.getString(PHONES_NUMBER_INDEX);  
  14.     // 當手機號碼爲空的或者爲空字段 跳過當前循環  
  15.     if (TextUtils.isEmpty(phoneNumber))  
  16.         continue;  
  17.     // 得到聯繫人名稱  
  18.     String contactName = phoneCursor 
  19.         .getString(PHONES_DISPLAY_NAME_INDEX);  
  20.  
  21.     //Sim卡中沒有聯繫人頭像  
  22.       
  23.     mContactsName.add(contactName);  
  24.     mContactsNumber.add(phoneNumber);  
  25.     }  
  26.  
  27.     phoneCursor.close();  
  28. }  
  29.    } 
這個界面就可以看到聯繫人的 名稱 號碼 以及頭像了。如果想在模擬器上看須要將圖片拷貝到SD卡中,然後在聯繫人中設置一下,這裏就可以看到頭像了,或者 真機上會比較清楚、
 

 

任意點擊一個聯繫人會調用系統撥打電話的界面 ,代碼如下。
  1. //調用系統方法撥打電話  
  2. Intent dialIntent = new Intent(Intent.ACTION_CALL, Uri  
  3.     .parse("tel:" + mContactsNumber.get(position)));  
  4. startActivity(dialIntent); 




最重要的是須要AndroidManifest.xml中 加入權限 否則代碼會報錯的。 千萬別忘了。

 

  1. <!-- 讀取聯繫人權限 -->   
  2. <uses-permission android:name="android.permission.READ_CONTACTS"/> 
  3. <!-- 撥打電話權限 --> 
  4. <uses-permission android:name="android.permission.CALL_PHONE"/>   


下面給出完整的代碼
 

  1. import java.io.InputStream;  
  2. import java.util.ArrayList;  
  3.  
  4. import android.app.ListActivity;  
  5. import android.content.ContentResolver;  
  6. import android.content.ContentUris;  
  7. import android.content.Context;  
  8. import android.content.Intent;  
  9. import android.database.Cursor;  
  10. import android.graphics.Bitmap;  
  11. import android.graphics.BitmapFactory;  
  12. import android.net.Uri;  
  13. import android.os.Bundle;  
  14. import android.provider.ContactsContract;  
  15. import android.provider.ContactsContract.CommonDataKinds.Phone;  
  16. import android.provider.ContactsContract.CommonDataKinds.Photo;  
  17. import android.text.TextUtils;  
  18. import android.view.LayoutInflater;  
  19. import android.view.View;  
  20. import android.view.ViewGroup;  
  21. import android.widget.AdapterView;  
  22. import android.widget.BaseAdapter;  
  23. import android.widget.ImageView;  
  24. import android.widget.ListView;  
  25. import android.widget.TextView;  
  26. import android.widget.AdapterView.OnItemClickListener;  
  27.  
  28. public class ContactsActivity extends ListActivity {  
  29.  
  30.     Context mContext = null;  
  31.  
  32.     /**獲取庫Phon表字段**/  
  33.     private static final String[] PHONES_PROJECTION = new String[] {  
  34.         Phone.DISPLAY_NAME, Phone.NUMBER, Photo.PHOTO_ID,Phone.CONTACT_ID };  
  35.      
  36.     /**聯繫人顯示名稱**/  
  37.     private static final int PHONES_DISPLAY_NAME_INDEX = 0;  
  38.       
  39.     /**電話號碼**/  
  40.     private static final int PHONES_NUMBER_INDEX = 1;  
  41.       
  42.     /**頭像ID**/  
  43.     private static final int PHONES_PHOTO_ID_INDEX = 2;  
  44.      
  45.     /**聯繫人的ID**/  
  46.     private static final int PHONES_CONTACT_ID_INDEX = 3;  
  47.       
  48.  
  49.     /**聯繫人名稱**/  
  50.     private ArrayList<String> mContactsName = new ArrayList<String>();  
  51.       
  52.     /**聯繫人頭像**/  
  53.     private ArrayList<String> mContactsNumber = new ArrayList<String>();  
  54.  
  55.     /**聯繫人頭像**/  
  56.     private ArrayList<Bitmap> mContactsPhonto = new ArrayList<Bitmap>();  
  57.       
  58.     ListView mListView = null;  
  59.     MyListAdapter myAdapter = null;  
  60.  
  61.     @Override  
  62.     public void onCreate(Bundle savedInstanceState) {  
  63.     mContext = this;  
  64.     mListView = this.getListView();  
  65.     /**得到手機通訊錄聯繫人信息**/  
  66.     getPhoneContacts();  
  67.  
  68.     myAdapter = new MyListAdapter(this);  
  69.     setListAdapter(myAdapter);  
  70.  
  71.  
  72.     mListView.setOnItemClickListener(new OnItemClickListener() {  
  73.  
  74.         @Override  
  75.         public void onItemClick(AdapterView<?> adapterView, View view,  
  76.             int position, long id) {  
  77.         //調用系統方法撥打電話  
  78.         Intent dialIntent = new Intent(Intent.ACTION_CALL, Uri  
  79.             .parse("tel:" + mContactsNumber.get(position)));  
  80.         startActivity(dialIntent);  
  81.         }  
  82.     });  
  83.  
  84.     super.onCreate(savedInstanceState);  
  85.     }  
  86.  
  87.     /**得到手機通訊錄聯繫人信息**/  
  88.     private void getPhoneContacts() {  
  89.     ContentResolver resolver = mContext.getContentResolver();  
  90.  
  91.     // 獲取手機聯繫人  
  92.     Cursor phoneCursor = resolver.query(Phone.CONTENT_URI,PHONES_PROJECTION, null, null, null);  
  93.  
  94.  
  95.     if (phoneCursor != null) {  
  96.         while (phoneCursor.moveToNext()) {  
  97.  
  98.         //得到手機號碼  
  99.         String phoneNumber = phoneCursor.getString(PHONES_NUMBER_INDEX);  
  100.         //當手機號碼爲空的或者爲空字段 跳過當前循環  
  101.         if (TextUtils.isEmpty(phoneNumber))  
  102.             continue;  
  103.           
  104.         //得到聯繫人名稱  
  105.         String contactName = phoneCursor.getString(PHONES_DISPLAY_NAME_INDEX);  
  106.           
  107.         //得到聯繫人ID  
  108.         Long contactid = phoneCursor.getLong(PHONES_CONTACT_ID_INDEX);  
  109.  
  110.         //得到聯繫人頭像ID  
  111.         Long photoid = phoneCursor.getLong(PHONES_PHOTO_ID_INDEX);  
  112.           
  113.         //得到聯繫人頭像Bitamp  
  114.         Bitmap contactPhoto = null;  
  115.  
  116.         //photoid 大於0 表示聯繫人有頭像 如果沒有給此人設置頭像則給他一個默認的  
  117.         if(photoid > 0 ) {  
  118.             Uri uri =ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI,contactid);  
  119.             InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(resolver, uri);  
  120.             contactPhoto = BitmapFactory.decodeStream(input);  
  121.         }else {  
  122.             contactPhoto = BitmapFactory.decodeResource(getResources(), R.drawable.contact_photo);  
  123.         }  
  124.           
  125.         mContactsName.add(contactName);  
  126.         mContactsNumber.add(phoneNumber);  
  127.         mContactsPhonto.add(contactPhoto);  
  128.         }  
  129.  
  130.         phoneCursor.close();  
  131.     }  
  132.     }  
  133.       
  134.     /**得到手機SIM卡聯繫人人信息**/  
  135.     private void getSIMContacts() {  
  136.     ContentResolver resolver = mContext.getContentResolver();  
  137.     // 獲取Sims卡聯繫人  
  138.     Uri uri = Uri.parse("content://icc/adn");  
  139.     Cursor phoneCursor = resolver.query(uri, PHONES_PROJECTION, null, null,  
  140.         null);  
  141.  
  142.     if (phoneCursor != null) {  
  143.         while (phoneCursor.moveToNext()) {  
  144.  
  145.         // 得到手機號碼  
  146.         String phoneNumber = phoneCursor.getString(PHONES_NUMBER_INDEX);  
  147.         // 當手機號碼爲空的或者爲空字段 跳過當前循環  
  148.         if (TextUtils.isEmpty(phoneNumber))  
  149.             continue;  
  150.         // 得到聯繫人名稱  
  151.         String contactName = phoneCursor 
  152.             .getString(PHONES_DISPLAY_NAME_INDEX);  
  153.  
  154.         //Sim卡中沒有聯繫人頭像  
  155.           
  156.         mContactsName.add(contactName);  
  157.         mContactsNumber.add(phoneNumber);  
  158.         }  
  159.  
  160.         phoneCursor.close();  
  161.     }  
  162.     }  
  163.       
  164.     class MyListAdapter extends BaseAdapter {  
  165.     public MyListAdapter(Context context) {  
  166.         mContext = context;  
  167.     }  
  168.  
  169.     public int getCount() {  
  170.         //設置繪製數量  
  171.         return mContactsName.size();  
  172.     }  
  173.  
  174.     @Override  
  175.     public boolean areAllItemsEnabled() {  
  176.         return false;  
  177.     }  
  178.  
  179.     public Object getItem(int position) {  
  180.         return position;  
  181.     }  
  182.  
  183.     public long getItemId(int position) {  
  184.         return position;  
  185.     }  
  186.  
  187.     public View getView(int position, View convertView, ViewGroup parent) {  
  188.         ImageView iamge = null;  
  189.         TextView title = null;  
  190.         TextView text = null;  
  191.         if (convertView == null) {  
  192.         convertView = LayoutInflater.from(mContext).inflate(  
  193.             R.layout.colorlist, null);  
  194.         iamge = (ImageView) convertView.findViewById(R.id.color_image);  
  195.         title = (TextView) convertView.findViewById(R.id.color_title);  
  196.         text = (TextView) convertView.findViewById(R.id.color_text);  
  197.         }  
  198.         //繪製聯繫人名稱  
  199.         title.setText(mContactsName.get(position));  
  200.         //繪製聯繫人號碼  
  201.         text.setText(mContactsNumber.get(position));  
  202.         //繪製聯繫人頭像  
  203.         iamge.setImageBitmap(mContactsPhonto.get(position));  
  204.         return convertView;  
  205.     }  
  206.  
  207.     }  

 列表的佈局文件
 

  1. <?xml version="1.0" encoding="utf-8"?>    
  2.     
  3. <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    
  4.     android:layout_width="fill_parent" android:layout_height="wrap_content">    
  5.     <ImageView android:id="@+id/color_image"    
  6.         android:layout_width="40dip" android:layout_height="40dip" />    
  7.     <TextView android:id="@+id/color_title"    
  8.         android:layout_width="fill_parent" android:layout_height="wrap_content"    
  9.         android:layout_toRightOf="@+id/color_image"    
  10.         android:layout_alignParentBottom="true"    
  11.         android:layout_alignParentRight="true" android:singleLine="true"    
  12.         android:ellipsize="marquee"     
  13.         android:textSize="15dip"  />    
  14.     <TextView android:id="@+id/color_text"    
  15.         android:layout_width="fill_parent" android:layout_height="wrap_content"    
  16.         android:layout_toRightOf="@+id/color_image"    
  17.         android:layout_below="@+id/color_title"    
  18.         android:layout_alignParentBottom="true"    
  19.         android:layout_alignParentRight="true"     
  20.         android:singleLine="true"    
  21.         android:ellipsize="marquee"     
  22.         android:textSize="20dip" />    
  23. </RelativeLayout>   


這章的內容如果有更熟悉的朋友歡迎和我一起討論。老規矩每篇文章都會附帶源代碼,最後如果你還是覺得我寫的不夠詳細 看的不夠爽 不要緊我把源代碼的下載地址貼出來 歡迎大家一起討論學習雨鬆MOMO希望可以和大家一起進步。
 
下載地址:http://download.csdn.net/source/3559166

本文出自 “雨鬆MOMO的程序世界” 博客,請務必保留此出處http://xys289187120.blog.51cto.com/3361352/656766


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章