• <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>

            life02

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

            發布于2011-10-12

             

            圖中選中的數據庫 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) {  

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

                    }  

                    //繪制聯系人名稱  

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

                    //繪制聯系人號碼  

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

                    //繪制聯系人頭像  

                    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 閱讀(2253) 評論(0)  編輯 收藏 引用 所屬分類: Android開發
            色综合久久综精品| 日产精品久久久久久久| 久久久久高潮综合影院| 精品久久久久久国产牛牛app| 国产精品久久99| 2022年国产精品久久久久| 久久99国产综合精品免费| 色欲综合久久躁天天躁蜜桃| 性高湖久久久久久久久| 久久久久久夜精品精品免费啦| 久久久久无码精品国产| 久久99久久99小草精品免视看| 久久国产乱子伦精品免费强| 日韩欧美亚洲综合久久影院d3| 精品久久久久久无码中文字幕| 欧美久久久久久精选9999| 无码乱码观看精品久久| 色婷婷综合久久久久中文一区二区| 欧美喷潮久久久XXXXx| 久久久精品午夜免费不卡| 国产精品久久久99| 亚洲伊人久久综合影院| 日产精品久久久一区二区| 一本久久久久久久| 四虎国产精品成人免费久久| 综合网日日天干夜夜久久| 久久精品国产清高在天天线| 亚洲天堂久久精品| 99蜜桃臀久久久欧美精品网站| 99久久精品影院老鸭窝| 亚洲第一永久AV网站久久精品男人的天堂AV| 久久国产综合精品五月天| 午夜精品久久久久久中宇| 日韩一区二区久久久久久| 久久久久久精品久久久久| av午夜福利一片免费看久久| 久久久久亚洲av成人无码电影| 国内精品综合久久久40p| 久久久久人妻一区精品| 久久精品无码午夜福利理论片 | 99久久国产综合精品麻豆|