Android软件开发之获取通讯录联系人信息




雨松MOMO原创文章如转载,请注明:转载至我的独立域名博客雨松MOMO程序研究院,原文地址:http://www.xuanyusong.com/archives/169








        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第二个参数 


 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);//得到联系人IDLong contactid = phoneCursor.getLong(PHONES_CONTACT_ID_INDEX);//得到联系人头像IDLong photoid = phoneCursor.getLong(PHONES_PHOTO_ID_INDEX);//得到联系人头像BitampBitmap 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, 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);//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中 加入权限 否则代码会报错的。 千万别忘了。


               





下面给出完整的代码

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 mContactsName = new ArrayList();        /**联系人头像**/    private ArrayList mContactsNumber = new ArrayList();    /**联系人头像**/    private ArrayList mContactsPhonto = new ArrayList();        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, 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);//得到联系人IDLong contactid = phoneCursor.getLong(PHONES_CONTACT_ID_INDEX);//得到联系人头像IDLong photoid = phoneCursor.getLong(PHONES_PHOTO_ID_INDEX);//得到联系人头像BitampBitmap 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, 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);//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();}@Overridepublic 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 || position < mContactsNumber.size()) {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"?>                          




这章的内容如果有更熟悉的朋友欢迎和我一起讨论。老规矩每篇文章都会附带源代码,最后如果你还是觉得我写的不够详细 看的不够爽 不要紧我把源代码的下载地址贴出来 欢迎大家一起讨论学习雨松MOMO希望可以和大家一起进步。



下载地址:http://www.xuanyusong.com/archives/169

更多相关文章

  1. android 监控联系人变化
  2. Android BLE与终端通信(一)——Android Bluetooth基础API以及简单
  3. 利用NotificationListenerService获取微信通知消息的头像和内容
  4. Android 最快速获取通讯录所有手机号、对应姓名和头像
  5. 学习笔记之——Android中的Picasso实现圆形头像、圆角图片工具类
  6. Glide 加载圆形头像和gif 图
  7. Android官方API Demo学习之联系人获取
  8. Android获取应用程序的名称,包名,版本号
  9. android通过图片名称获取资源识别码

随机推荐

  1. Binder之bindService
  2. android 增加重启功能
  3. Android 预置APK的权限授予
  4. Windows系统下制作Android开关机动画
  5. android 屏幕上面画线
  6. Android使用NDK进行联网签名认证
  7. android官方资源下载url
  8. iOS与Android对比学之NSNotificationCent
  9. Android 启动app的几种方式
  10. Android(安卓)Studio里面的Build.gradle