青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

life02

  C++博客 :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
  197 隨筆 :: 3 文章 :: 37 評論 :: 0 Trackbacks
Android軟件開發(fā)之獲取通訊錄聯(lián)系人信息(十二)
http://www.uml.org.cn/mobiledev/201110121.asp
 

發(fā)布于2011-10-12

 

圖中選中的數(shù)據(jù)庫 contacts2.db就是系統(tǒng)儲存聯(lián)系人的數(shù)據(jù)庫,我們將它打開看看里面儲存了些什么東東?

打開contacts.db后 發(fā)面里面有一堆表,同學(xué)們先別慌張。今天我們主要討論紅框內(nèi)的4個(gè)比較常用的表,后期我在介紹其它表的使用。這里說一下如果你想在真機(jī)上查看數(shù)據(jù)庫的話必需要先獲得root權(quán)限,否則無法查看。

1.contacts 表

_id :表的ID,主要用于其它表通過contacts 表中的ID可以查到相應(yīng)的數(shù)據(jù)。

display_name: 聯(lián)系人名稱

photo_id:頭像的ID,如果沒有設(shè)置聯(lián)系人頭像,這個(gè)字段就為空

times_contacted:通話記錄的次數(shù)

last_time_contacted: 最后的通話時(shí)間

lookup :是一個(gè)持久化的儲存 因?yàn)橛脩艨赡軙拿?但是它改不了lookup

2.data表

raw_contact_id:通過raw_contact_id可以找到 raw_contact表中相對的數(shù)據(jù)。

data1 到 data15 這里保存著聯(lián)系人的信息 聯(lián)系人名稱 聯(lián)系人電話號碼 電子郵件 備注 等等。

3.phone_look_up表

data_id : 通過data_id可以找到 datat表中相對的數(shù)據(jù)。

raw_contact_id : 通過raw_contact_id 可以找到 raw_contact_表中相對的數(shù)據(jù)。

normalized_number: 這個(gè)字段就比較有意思了,它是將每個(gè)電話號碼逆序排列。

4.raw_contact表

version :版本號,用于監(jiān)聽變化

deleted :刪除標(biāo)志, 0為默認(rèn) 1 表示這行數(shù)據(jù)已經(jīng)刪除

display_name : 聯(lián)系人名稱

last_time_contacts : 最后聯(lián)系的時(shí)間

有關(guān)這些的源碼都在android.provider.ContactsContract這個(gè)類里面,如果想深入了解的話 可以去看看,數(shù)據(jù)庫相關(guān)的操作 聯(lián)查啊 啥的 都在里面。

下面說說代碼是怎么用的

先說說 Phone.CONTENT_URI,獲取聯(lián)系人的時(shí)候需要去這個(gè)url中去找數(shù)據(jù) 。它所指向的其實(shí)是“content:// com.android.contacts/data/phones”。這個(gè)url 對應(yīng)著contacts表 和 raw_contacts表 以及 data表 所以說我們的數(shù)據(jù)都是從這三個(gè)表中獲取的。

這里強(qiáng)調(diào)一下query第二個(gè)參數(shù)

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

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

它的意思是只去表中找 顯示名稱 電話號碼 頭像ID 聯(lián)系人ID 這4個(gè)數(shù)據(jù) ,如果你須要其它數(shù)據(jù) 的話 就須要修改這里。

獲得手機(jī)通訊錄聯(lián)系人信息

/**得到手機(jī)通訊錄聯(lián)系人信息**/  

   private void getPhoneContacts() {  

ContentResolver resolver = mContext.getContentResolver();  

// 獲取手機(jī)聯(lián)系人  

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

if (phoneCursor != null) {  

    while (phoneCursor.moveToNext()) {  

    //得到手機(jī)號碼  

    String phoneNumber = phoneCursor.getString(PHONES_NUMBER_INDEX);  

    //當(dāng)手機(jī)號碼為空的或者為空字段 跳過當(dāng)前循環(huán)  

    if (TextUtils.isEmpty(phoneNumber))  

        continue;  

    //得到聯(lián)系人名稱  

    String contactName = phoneCursor.getString(PHONES_DISPLAY_NAME_INDEX);  

    //得到聯(lián)系人ID  

    Long contactid = phoneCursor.getLong(PHONES_CONTACT_ID_INDEX);  

    //得到聯(lián)系人頭像ID  

    Long photoid = phoneCursor.getLong(PHONES_PHOTO_ID_INDEX);  

    //得到聯(lián)系人頭像Bitamp  

    Bitmap contactPhoto = null;  

    //photoid 大于0 表示聯(lián)系人有頭像 如果沒有給此人設(shè)置頭像則給他一個(gè)默認(rèn)的  

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

}  

   }  

獲得手機(jī)sim卡聯(lián)系人信息

sim卡和手機(jī)本人 獲取的方式類似 只是url有點(diǎn)不一樣 ,須要注意的一點(diǎn)是 sim卡 是沒有聯(lián)系人頭像的。

 /**得到手機(jī)SIM卡聯(lián)系人人信息**/  

   private void getSIMContacts() {  

ContentResolver resolver = mContext.getContentResolver();  

// 獲取Sims卡聯(lián)系人  

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

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

    null);  

if (phoneCursor != null) {  

    while (phoneCursor.moveToNext()) {  

  

    // 得到手機(jī)號碼  

    String phoneNumber = phoneCursor.getString(PHONES_NUMBER_INDEX);  

    // 當(dāng)手機(jī)號碼為空的或者為空字段 跳過當(dāng)前循環(huán)  

    if (TextUtils.isEmpty(phoneNumber))  

        continue;  

    // 得到聯(lián)系人名稱  

    String contactName = phoneCursor  

        .getString(PHONES_DISPLAY_NAME_INDEX);  

    //Sim卡中沒有聯(lián)系人頭像 

    mContactsName.add(contactName);  

    mContactsNumber.add(phoneNumber);  

    }  

    phoneCursor.close();  

}  

   } 

這個(gè)界面就可以看到聯(lián)系人的 名稱 號碼 以及頭像了。如果想在模擬器上看須要將圖片拷貝到SD卡中,然后在聯(lián)系人中設(shè)置一下,這里就可以看到頭像了,或者 真機(jī)上會比較清楚、

任意點(diǎn)擊一個(gè)聯(lián)系人會調(diào)用系統(tǒng)撥打電話的界面 ,代碼如下。

//調(diào)用系統(tǒng)方法撥打電話  

Intent dialIntent = new Intent(Intent.ACTION_CALL, Uri  

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

startActivity(dialIntent); 

最重要的是須要AndroidManifest.xml中 加入權(quán)限 否則代碼會報(bào)錯(cuò)的。 千萬別忘了。

<!-- 讀取聯(lián)系人權(quán)限 -->   

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

<!-- 撥打電話權(quán)限 -->  

<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 };  

    /**聯(lián)系人顯示名稱**/  

    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;  

    /**聯(lián)系人的ID**/  

    private static final int PHONES_CONTACT_ID_INDEX = 3;  

    /**聯(lián)系人名稱**/  

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

    /**聯(lián)系人頭像**/  

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

    /**聯(lián)系人頭像**/  

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

    ListView mListView = null;  

    MyListAdapter myAdapter = null;  

    @Override  

    public void onCreate(Bundle savedInstanceState) {  

    mContext = this;  

    mListView = this.getListView();  

    /**得到手機(jī)通訊錄聯(lián)系人信息**/  

    getPhoneContacts();  

    myAdapter = new MyListAdapter(this);  

    setListAdapter(myAdapter);  

    mListView.setOnItemClickListener(new OnItemClickListener() {  

        @Override  

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

            int position, long id) {  

        //調(diào)用系統(tǒng)方法撥打電話  

        Intent dialIntent = new Intent(Intent.ACTION_CALL, Uri  

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

        startActivity(dialIntent);  

        }  

    });  

    super.onCreate(savedInstanceState);  

    }  

    /**得到手機(jī)通訊錄聯(lián)系人信息**/  

    private void getPhoneContacts() {  

    ContentResolver resolver = mContext.getContentResolver();  

    // 獲取手機(jī)聯(lián)系人  

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

    if (phoneCursor != null) {  

        while (phoneCursor.moveToNext()) {  

        //得到手機(jī)號碼  

        String phoneNumber = phoneCursor.getString(PHONES_NUMBER_INDEX);  

        //當(dāng)手機(jī)號碼為空的或者為空字段 跳過當(dāng)前循環(huán)  

        if (TextUtils.isEmpty(phoneNumber))  

            continue

        //得到聯(lián)系人名稱  

        String contactName = phoneCursor.getString(PHONES_DISPLAY_NAME_INDEX);  

        //得到聯(lián)系人ID  

        Long contactid = phoneCursor.getLong(PHONES_CONTACT_ID_INDEX);  

        //得到聯(lián)系人頭像ID  

        Long photoid = phoneCursor.getLong(PHONES_PHOTO_ID_INDEX);  

        //得到聯(lián)系人頭像Bitamp  

        Bitmap contactPhoto = null;  

        //photoid 大于0 表示聯(lián)系人有頭像 如果沒有給此人設(shè)置頭像則給他一個(gè)默認(rèn)的  

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

    }  

    }  

    /**得到手機(jī)SIM卡聯(lián)系人人信息**/  

    private void getSIMContacts() {  

    ContentResolver resolver = mContext.getContentResolver();  

    // 獲取Sims卡聯(lián)系人  

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

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

        null);  

    if (phoneCursor != null) {  

        while (phoneCursor.moveToNext()) {  

        // 得到手機(jī)號碼  

        String phoneNumber = phoneCursor.getString(PHONES_NUMBER_INDEX);  

        // 當(dāng)手機(jī)號碼為空的或者為空字段 跳過當(dāng)前循環(huán)  

        if (TextUtils.isEmpty(phoneNumber))  

            continue;  

        // 得到聯(lián)系人名稱  

        String contactName = phoneCursor  

            .getString(PHONES_DISPLAY_NAME_INDEX);  

        //Sim卡中沒有聯(lián)系人頭像  

        mContactsName.add(contactName);  

        mContactsNumber.add(phoneNumber);  

        }  

        phoneCursor.close();  

    }  

    }  

    class MyListAdapter extends BaseAdapter {  

    public MyListAdapter(Context context) {  

        mContext = context;  

    }  

    public int getCount() {  

        //設(shè)置繪制數(shù)量  

        return mContactsName.size();  

    }  

    @Override  

    public boolean areAllItemsEnabled() {  

        return false;  

    }  

    public Object getItem(int position) {  

        return position;  

    }  

    public long getItemId(int position) {  

        return position;  

    }  

    public View getView(int position, View convertView, ViewGroup parent) {  

        ImageView iamge = null;  

        TextView title = null;  

        TextView text = null;  

        if (convertView == null) {  

        convertView = LayoutInflater.from(mContext).inflate(  

            R.layout.colorlist, null);  

        iamge = (ImageView) convertView.findViewById(R.id.color_image);  

        title = (TextView) convertView.findViewById(R.id.color_title);  

        text = (TextView) convertView.findViewById(R.id.color_text);  

        }  

        //繪制聯(lián)系人名稱  

        title.setText(mContactsName.get(position));  

        //繪制聯(lián)系人號碼  

        text.setText(mContactsNumber.get(position));  

        //繪制聯(lián)系人頭像  

        iamge.setImageBitmap(mContactsPhonto.get(position));  

        return convertView;  

    }  

    }  

}  

列表的布局文件

<?xml version="1.0" encoding="utf-8"?>    

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"    

    android:layout_width="fill_parent" android:layout_height="wrap_content">    

    <ImageView android:id="@+id/color_image"    

        android:layout_width="40dip" android:layout_height="40dip" />    

    <TextView android:id="@+id/color_title"    

        android:layout_width="fill_parent" android:layout_height="wrap_content"    

        android:layout_toRightOf="@+id/color_image"    

        android:layout_alignParentBottom="true"    

        android:layout_alignParentRight="true" android:singleLine="true"    

        android:ellipsize="marquee"     

        android:textSize="15dip"  />    

    <TextView android:id="@+id/color_text"    

        android:layout_width="fill_parent" android:layout_height="wrap_content"    

        android:layout_toRightOf="@+id/color_image"    

        android:layout_below="@+id/color_title"    

        android:layout_alignParentBottom="true"    

        android:layout_alignParentRight="true"     

        android:singleLine="true"    

        android:ellipsize="marquee"     

        android:textSize="20dip" />    

</RelativeLayout>

posted on 2011-12-08 11:30 life02 閱讀(2279) 評論(0)  編輯 收藏 引用 所屬分類: Android開發(fā)
青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲精品一区二区三区樱花| 亚洲欧美日韩一区二区在线 | 久久不见久久见免费视频1| 91久久精品日日躁夜夜躁国产| 一区二区三区在线高清| 一区二区三区自拍| 亚洲开发第一视频在线播放| 一区二区三区高清不卡| 午夜精品一区二区三区在线| 久久精品国产亚洲精品| 久久久久国产免费免费| 欧美wwwwww| 亚洲精品久久嫩草网站秘色| 亚洲精品乱码久久久久久蜜桃91| 一本色道久久精品| 亚洲欧美日韩在线不卡| 久久综合色婷婷| 欧美视频在线观看免费网址| 国产亚洲欧美日韩日本| 亚洲激情在线激情| 性欧美超级视频| 久久裸体视频| 欧美日韩视频在线一区二区 | 国产精品亚洲网站| 在线观看视频一区二区| 亚洲视频电影图片偷拍一区| 久久激情五月激情| 亚洲激情偷拍| 午夜精品视频| 欧美日韩一级黄| 韩日精品在线| 中文在线一区| 欧美激情中文字幕乱码免费| 亚洲综合社区| 欧美日韩在线不卡一区| 精品av久久久久电影| 亚洲在线免费观看| 亚洲精品护士| 国产精品专区第二| 国产欧美精品在线播放| 欧美精品一区二区三区在线播放 | 亚洲深夜福利| 性欧美大战久久久久久久久| 亚洲国产天堂网精品网站| 在线免费观看成人网| 亚洲国产一区二区在线| 午夜精彩视频在线观看不卡 | 欧美精品国产精品日韩精品| 国产精品久久久91| 亚洲欧洲综合另类在线| 欧美在线观看一二区| 日韩午夜精品| 欧美国产日本高清在线| **网站欧美大片在线观看| 久久精品网址| 欧美一区二区三区播放老司机| 欧美日韩免费观看一区二区三区| 黄色成人在线网址| 亚欧成人精品| 新67194成人永久网站| 欧美日韩三级一区二区| 99这里只有精品| 91久久久久久久久| 欧美成人亚洲| 一本色道久久综合狠狠躁篇的优点| 欧美国产大片| 亚洲人成人99网站| 欧美成年视频| 欧美国产91| 在线视频欧美日韩| 亚洲午夜伦理| 韩日精品视频一区| 欧美国产日韩视频| 欧美日韩国产影院| 亚洲欧美日韩区| 亚洲伦理在线观看| 亚洲人体1000| 亚洲日本中文字幕区| 欧美国产视频在线| 亚洲视频在线视频| 亚洲视频你懂的| 国产亚洲午夜| 欧美+亚洲+精品+三区| 免费欧美高清视频| 夜夜夜久久久| 午夜在线一区| 91久久精品国产91性色| 一本色道久久综合| 国产小视频国产精品| 欧美成人69| 欧美午夜精品久久久久久久 | 久久精品国产清高在天天线| 先锋资源久久| 亚洲黄色免费网站| 一区二区三区av| 狠久久av成人天堂| 欧美a级片网站| 国产精品a久久久久久| 久久久精品久久久久| 欧美激情第一页xxx| 欧美一区二区三区四区在线| 久久久久久尹人网香蕉| 亚洲午夜影视影院在线观看| 久久成人综合网| 亚洲一区二区三区高清| 欧美在线视频一区二区三区| 一区二区三区视频在线播放| 久久国产免费| 亚洲美女av电影| 韩日视频一区| 亚洲精选在线观看| 亚洲经典在线看| 欧美一区免费视频| 99精品视频免费| 欧美 日韩 国产一区二区在线视频| 久久一综合视频| 国产精品初高中精品久久| 欧美搞黄网站| 激情文学综合丁香| 午夜久久99| 午夜国产一区| 欧美天堂亚洲电影院在线播放| 美乳少妇欧美精品| 国产日韩专区| 在线视频你懂得一区| 亚洲精品自在在线观看| 久久久久久久久久久久久久一区| 亚洲美女黄色片| 欧美一区二区网站| 久久精品1区| 国产精品高潮呻吟久久av无限| 欧美国产先锋| 一区二区在线视频播放| 亚洲男人的天堂在线aⅴ视频| 亚洲精品亚洲人成人网| 麻豆精品精华液| 男女精品网站| 1000部精品久久久久久久久| 久久免费精品视频| 欧美一区2区三区4区公司二百| 亚洲视频狠狠| 欧美特黄视频| 亚洲欧美日韩精品在线| 久久精品国产免费看久久精品| 国产一区视频在线看| 午夜精品久久久久久99热软件| 午夜精品久久久久久久| 国产精品爽黄69| 欧美专区在线| 欧美激情aaaa| 亚洲欧洲另类国产综合| 亚洲图片欧美一区| 国产精品嫩草影院一区二区| 亚洲视频www| 午夜亚洲福利在线老司机| 国产精品毛片a∨一区二区三区|国| 一区二区三区成人精品| 欧美一区二区视频网站| 国产欧美短视频| 久久er精品视频| 亚洲第一页自拍| 亚洲欧美激情视频在线观看一区二区三区 | 性欧美长视频| 永久免费精品影视网站| 欧美精品尤物在线| 亚洲免费在线视频| 亚洲第一精品影视| 亚洲一区综合| 国产主播一区| 欧美激情综合五月色丁香| 在线一区视频| 免费视频亚洲| 午夜一区不卡| 亚洲精品看片| 国产自产女人91一区在线观看| 免费在线欧美视频| 欧美亚洲一区在线| 91久久夜色精品国产网站| 欧美一区午夜精品| 亚洲国产精品成人| 国产一区二区三区成人欧美日韩在线观看 | 欧美激情亚洲一区| 午夜精品久久久久99热蜜桃导演| 欧美黄色影院| 久久精品日韩欧美| 亚洲一区二区三区在线| 91久久久久久| 日韩亚洲在线| 久久欧美中文字幕| 亚洲午夜成aⅴ人片| 亚洲电影在线看| 国产一区二区三区在线观看精品 | 国产精品乱码一区二区三区| 美女主播一区| 欧美一区=区| 欧美一区二区福利在线| 亚洲调教视频在线观看| 日韩亚洲在线| 亚洲美女电影在线| 91久久久久久|