1. 程式人生 > >Android軟體開發之獲取通訊錄聯絡人 聯絡人影象

Android軟體開發之獲取通訊錄聯絡人 聯絡人影象

圖中選中的資料庫 contacts2.db就是系統儲存聯絡人的資料庫,我們將它開啟看看裡面儲存了些什麼東東?

開啟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第二個引數

private static final String[] PHONES_PROJECTION = new String[] {

    Phone.DISPLAY_NAME, Phone.NUMBER, Photo.PHOTO_ID,Phone.CONTACT_ID };

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

獲得手機通訊錄聯絡人資訊

/**得到手機通訊錄聯絡人資訊**/  

   private void getPhoneContacts() {  

ContentResolver resolver = mContext.getContentResolver();  

// 獲取手機聯絡人  

Cursor phoneCursor = resolver.query(Phone.CONTENT_URI,PHONES_PROJECTION, null, null, null);  

if (phoneCursor != null) {  

    while (phoneCursor.moveToNext()) {  

    //得到手機號碼  

    String phoneNumber = phoneCursor.getString(PHONES_NUMBER_INDEX);  

    //當手機號碼為空的或者為空欄位 跳過當前迴圈  

    if (TextUtils.isEmpty(phoneNumber))  

        continue;  

    //得到聯絡人名稱  

    String contactName = phoneCursor.getString(PHONES_DISPLAY_NAME_INDEX);  

    //得到聯絡人ID  

    Long contactid = phoneCursor.getLong(PHONES_CONTACT_ID_INDEX);  

    //得到聯絡人頭像ID  

    Long photoid = phoneCursor.getLong(PHONES_PHOTO_ID_INDEX);  

    //得到聯絡人頭像Bitamp  

    Bitmap contactPhoto = null;  

    //photoid 大於0 表示聯絡人有頭像 如果沒有給此人設定頭像則給他一個預設的  

    if(photoid > 0 ) {  

        Uri uri =ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI,contactid);  

        InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(resolver, uri);  

        contactPhoto = BitmapFactory.decodeStream(input);  

    }else {  

        contactPhoto = BitmapFactory.decodeResource(getResources(), R.drawable.contact_photo);  

    }  

    mContactsName.add(contactName);  

    mContactsNumber.add(phoneNumber);  

    mContactsPhonto.add(contactPhoto);  

    }  

    phoneCursor.close();  

}  

   }  

獲得手機sim卡聯絡人資訊

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

 /**得到手機SIM卡聯絡人人資訊**/  

   private void getSIMContacts() {  

ContentResolver resolver = mContext.getContentResolver();  

// 獲取Sims卡聯絡人  

Uri uri = Uri.parse("content://icc/adn");  

Cursor phoneCursor = resolver.query(uri, PHONES_PROJECTION, nullnull,  

    null);  

if (phoneCursor != null) {  

    while (phoneCursor.moveToNext()) {  

    // 得到手機號碼  

    String phoneNumber = phoneCursor.getString(PHONES_NUMBER_INDEX);  

    // 當手機號碼為空的或者為空欄位 跳過當前迴圈  

    if (TextUtils.isEmpty(phoneNumber))  

        continue;  

    // 得到聯絡人名稱  

    String contactName = phoneCursor  

        .getString(PHONES_DISPLAY_NAME_INDEX);  

    //Sim卡中沒有聯絡人頭像 

    mContactsName.add(contactName);  

    mContactsNumber.add(phoneNumber);  

    }  

    phoneCursor.close();  

}  

   } 

這個介面就可以看到聯絡人的 名稱 號碼 以及頭像了。如果想在模擬器上看須要將圖片拷貝到SD卡中,然後在聯絡人中設定一下,這裡就可以看到頭像了,或者 真機上會比較清楚、

任意點選一個聯絡人會呼叫系統撥打電話的介面 ,程式碼如下。

//呼叫系統方法撥打電話  

Intent dialIntent = new Intent(Intent.ACTION_CALL, Uri  

    .parse("tel:" + mContactsNumber.get(position)));  

startActivity(dialIntent); 

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

<!-- 讀取聯絡人許可權 -->   

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

<!-- 撥打電話許可權 -->  

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

下面給出完整的程式碼

import java.io.InputStream;  

import java.util.ArrayList;  

import android.app.ListActivity;  

import android.content.ContentResolver;  

import android.content.ContentUris;  

import android.content.Context;  

import android.content.Intent;  

import android.database.Cursor;  

import android.graphics.Bitmap;  

import android.graphics.BitmapFactory;  

import android.net.Uri;  

import android.os.Bundle;  

import android.provider.ContactsContract;  

import android.provider.ContactsContract.CommonDataKinds.Phone;  

import android.provider.ContactsContract.CommonDataKinds.Photo;  

import android.text.TextUtils;  

import android.view.LayoutInflater;  

import android.view.View;  

import android.view.ViewGroup;  

import android.widget.AdapterView;  

import android.widget.BaseAdapter;  

import android.widget.ImageView;  

import android.widget.ListView;  

import android.widget.TextView;  

import android.widget.AdapterView.OnItemClickListener;  

public class ContactsActivity extends ListActivity {  

    Context mContext = null;  

    /**獲取庫Phon表字段**/  

    private static final String[] PHONES_PROJECTION = new String[] {  

        Phone.DISPLAY_NAME, Phone.NUMBER, Photo.PHOTO_ID,Phone.CONTACT_ID };  

    /**聯絡人顯示名稱**/  

    private static final int PHONES_DISPLAY_NAME_INDEX = 0;  

    /**電話號碼**/  

    private static final int PHONES_NUMBER_INDEX = 1;  

    /**頭像ID**/  

    private static final int PHONES_PHOTO_ID_INDEX = 2;  

    /**聯絡人的ID**/  

    private static final int PHONES_CONTACT_ID_INDEX = 3;  

    /**聯絡人名稱**/  

    private ArrayList<String> mContactsName = new ArrayList<String>();  

    /**聯絡人頭像**/  

    private ArrayList<String> mContactsNumber = new ArrayList<String>();  

    /**聯絡人頭像**/  

    private ArrayList<Bitmap> mContactsPhonto = new ArrayList<Bitmap>();  

    ListView mListView = null;  

    MyListAdapter myAdapter = null;  

    @Override  

    public void onCreate(Bundle savedInstanceState) {  

    mContext = this;  

    mListView = this.getListView();  

    /**得到手機通訊錄聯絡人資訊**/  

    getPhoneContacts();  

    myAdapter = new MyListAdapter(this);  

    setListAdapter(myAdapter);  

    mListView.setOnItemClickListener(new OnItemClickListener() {  

        @Override  

        public void onItemClick(AdapterView<?> adapterView, View view,  

            int position, long id) {  

        //呼叫系統方法撥打電話  

        Intent dialIntent = new Intent(Intent.ACTION_CALL, Uri  

            .parse("tel:" + mContactsNumber.get(position)));  

        startActivity(dialIntent);  

        }  

    });  

    super.onCreate(savedInstanceState);  

    }  

    /**得到手機通訊錄聯絡人資訊**/  

    private void getPhoneContacts() {  

    ContentResolver resolver = mContext.getContentResolver();  

    // 獲取手機聯絡人  

    Cursor phoneCursor = resolver.query(Phone.CONTENT_URI,PHONES_PROJECTION, nullnullnull);  

    if (phoneCursor != null) {  

        while (phoneCursor.moveToNext()) {  

        //得到手機號碼  

        String phoneNumber = phoneCursor.getString(PHONES_NUMBER_INDEX);  

        //當手機號碼為空的或者為空欄位 跳過當前迴圈  

        if (TextUtils.isEmpty(phoneNumber))  

            continue

        //得到聯絡人名稱  

        String contactName = phoneCursor.getString(PHONES_DISPLAY_NAME_INDEX);  

        //得到聯絡人ID  

        Long contactid = phoneCursor.getLong(PHONES_CONTACT_ID_INDEX);  

        //得到聯絡人頭像ID  

        Long photoid = phoneCursor.getLong(PHONES_PHOTO_ID_INDEX);  

        //得到聯絡人頭像Bitamp  

        Bitmap contactPhoto = null;  

        //photoid 大於0 表示聯絡人有頭像 如果沒有給此人設定頭像則給他一個預設的  

        if(photoid > 0 ) {  

            Uri uri =ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI,contactid);  

            InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(resolver, uri);  

            contactPhoto = BitmapFactory.decodeStream(input);  

        }else {  

            contactPhoto = BitmapFactory.decodeResource(getResources(), R.drawable.contact_photo);  

        }  

        mContactsName.add(contactName);  

        mContactsNumber.add(phoneNumber);  

        mContactsPhonto.add(contactPhoto);  

        }  

        phoneCursor.close();  

    }  

    }  

    /**得到手機SIM卡聯絡人人資訊**/  

    private void getSIMContacts() {  

    ContentResolver resolver = mContext.getContentResolver();  

    // 獲取Sims卡聯絡人  

    Uri uri = Uri.parse("content://icc/adn");  

    Cursor phoneCursor = resolver.query(uri, PHONES_PROJECTION, nullnull,  

        null);  

    if (phoneCursor != null) {  

        while (phoneCursor.moveToNext()) {  

        // 得到手機號碼  

        String phoneNumber = phoneCursor.getString(PHONES_NUMBER_INDEX);  

        // 當手機號碼為空的或者為空欄位 跳過當前迴圈  

        if (TextUtils.isEmpty(phoneNumber))  

            continue;  

        // 得到聯絡人名稱  

        String contactName = phoneCursor  

            .getString(PHONES_DISPLAY_NAME_INDEX);  

        //Sim卡中沒有聯絡人頭像  

        mContactsName.add(contactName);  

        mContactsNumber.add(phoneNumber);  

        }  

        phoneCursor.close();  

    }  

    }  

    class MyListAdapter extends BaseAdapter {  

    public MyListAdapter(Context context) {  

        mContext = context;  

    }  

    public int getCount() {  

        //設定繪製數量  

        return mContactsName.size();  

    }  

    @Override  

    public boolean areAllItemsEnabled() {  

        return false;  

    }  

    public Object getItem(int position) {  

        return position;  

    }  

    public long getItemId(int position) {  

        

相關推薦

Android軟體開發獲取通訊錄聯絡人 聯絡人影象

圖中選中的資料庫 contacts2.db就是系統儲存聯絡人的資料庫,我們將它開啟看看裡面儲存了些什麼東東? 開啟contacts.db後 發麵裡面有一堆表,同學們先別慌張。今天我們主要討論紅框內的4個比較常用的表,後期我在介紹其它表的使用。這裡說一下如果你想在真機上檢視資料庫的話必需要先獲得root許

Android軟體開發 自定義控制元件

Android軟體開發之 自定義控制元件 雖然Android系統提供了各種各樣的控制元件供我們開發使用,但在實際的開發中,系統提供的控制元件有時候不能滿足我們的需求,這時我們就需要自定義一個控制元件。 下面的例子就來自定義一個簡單的Button: 首先是佈局,image_btn.xml: <?xml

android軟體開發webView.addJavascriptInterface迴圈漸進【一】

程式碼 由於這裡是第一階段的webView所我就寫個最簡單的文章,這樣大家可以迴圈漸進的來了解addJavascriptInterface這句話是怎麼用的。 在這裡我們引用Google的一個事例下面是我Google給提供的一個dome的地址:點選開啟連結 我們先看它的HTM

Android 軟體開發如何使用Eclipse Debug除錯程式詳解

Ctrl+1 快速修復(最經典的快捷鍵,就不用多說了) Ctrl+D: 刪除當前行  Ctrl+Alt+↓ 複製當前行到下一行(複製增加) Ctrl+Alt+↑ 複製當前行到上一行(複製增加) Alt+↓ 當前行和下面一行互動位置(特別實用,可以省去先剪下,再貼上了) Alt+↑ 當前行和上面一行互動位置(同

Android(Java)開發獲取BLE廣播包(掃描後獲取:廣播資料+掃描應答資料+RSSI)

一、安卓BLE的廣播包資料從哪獲取? 通常,安卓APP讀寫BLE裝置的資料都是建立連線後通過GATT獲取或修改。但是,BLE裝置向外廣播時本身會攜帶一部分有用資訊,如將感測資料存放到廣播包的自定義資料段,最近接觸的一個iBeacon/EddyStone整合專案便是類似,因此

Android軟體開發應用程式之間的通訊介紹

Android 開發中在程式之間通訊的介面做的還是非常豐富的本例主要向大家介紹程式之間是如何進行溝通,有哪幾種溝通方式如何來實現溝通。 1.      使用handler傳遞訊息     handler 大家可以把它想象成主執行緒(UI執行緒)的一個子執行緒,它可以給主執

Android開發獲取SIM卡資訊和手機號碼

獲取SIM卡資訊和手機號碼的工具類,記錄一下方便以後使用 import android.content.Context; import android.telephony.TelephonyManager; /** * Created by WangJinyong on 20

Android開發獲取通知欄的內容

如下圖: 這是獲取的微信訊息的內容 我們來看下原始碼: MyNotifiService.java package com.qfy.getnotifiservice; import android.annotation.SuppressLint; import

Android開發獲取手機硬體狀態資訊(CPU資訊/頻率/使用率、DDR頻率/使用率、電池瞬時電流/電壓/庫倫counter)

有時候我們想要知道當前手機的一些狀態資訊,可以使用app(root 或者系統簽名 )來顯示獲取。 OK,接下來看一下一些關鍵的程式碼。 我這裡使用的是高通的手機,不同硬體平臺的機型,其獲取資訊的節點可能不一樣。 /** * 獲取當前瞬時電流

Android開發獲取當前時間

一、利用Calender獲取單個時間的一部分 Calendar c = Calendar.getInstance(); //取得年月日 year = c.get(Calendar.YEAR) m

Android開發獲取網路型別(WIFI、2G、3G、4G)和運營商名稱

  在Android開發中,常常使用到網路,可能需要針對不同的網路(WIFI或者流量),需要做不同的處理,那麼怎麼獲取當前網路呢?為此寫了個工具類,以後需要使用,直接拿來用就行(就喜歡拿來主義,哈哈)。 package com.wangguifa.phon

iOS開發獲取iPhone/iPad/Android 介面和icon尺寸規範

注意:iOS所有圖示的圓角效果由系統生成,給到的圖示本身不能是圓角的。1. 桌面圖示 (app icon)for iPhone6 plus(@3x) : 180 x 180for iPhone 6/5s

android開發獲取系統時間的方法

System.out.println("用Date方式顯示時間: " + now);//此方法顯示的結果和Calendar.getInstance().getTime()一樣System.out.println("用DateFormat.getDateInstance()格式化時間後為:" + str1);S

初次接觸Android APP開發安裝Android studio軟體出現的問題以及解決方案(錯誤史,一把辛酸淚)

     序言     筆者由於心血來潮,想玩玩Android開發。本想著用eclipes開發Android APP。但是發現網上說eclipes不是最好的選擇,所以筆者就放棄了熟悉的eclipes來開發Android APP,改用Android studio。在此之前,筆

Android開發獲取APK的包名

近期在開發一款APP,需要呼叫google play service,前提是安裝了。雖然可以通過以下程式碼可以判斷是否安裝了,但是有時總是棋差一著。關鍵的包名沒找著,難以對此功能實踐。 private boolean isApplicationExist(String p

Android網路開發實時獲取最新資料

在實際開發中更多的是需要我們實時獲取最新資料,比如道路流量、實時天氣資訊等,這時就需要通過一個執行緒來控制檢視的更新。 示例:我們首先建立一個網頁來顯示系統當前的時間,然後在Android程式中每隔5秒重新整理一次檢視,以達到實時更新的效果。 在Androi

Android應用開發所有動畫使用詳解

factory 技術分享 resource bsp phi 顯示 程序 恢復 分享 題外話:有段時間沒有更新博客了,這篇文章也是之前寫了一半一直放在草稿箱,今天抽空把剩余的補上的。消失的這段時間真的好忙,節奏一下子有些適應不過來,早晨七點四十就得醒來,晚上九點四十才準備下班

Android簡單開發 通用Adapter ViewHolder

chap int mage getitem fail abs earch this get 我們尋常使用Adapter的方式 public class BusbaseSearchApadter extends SimpleBaseApadter { priva

HTML5開發獲取設備的地理坐標

瀏覽器 innerhtml nav set int sdn -s tle pri 近期一段時間開始學一下html5,發現裏面有好多的知識還是蠻新穎的。所以整理了一下自己練習過的demo給大家分享下,以下的代碼是通過js接口獲取當前的地理坐標。 &

初入android驅動開發字符設備(四-中斷)

異常 ade 線程 pts 解碼 hand 地址 bsp -m 上一篇講到android驅動開發中,應用是怎樣去操作底層硬件的整個流程,實現了按鍵控制led的亮滅。當然,這是一個非常easy的實例,只是略微演變一下,就能夠得到廣泛的應用。如開發掃描頭,應用透過監聽上