(android)解剖contentProvider获取通讯录列表-002

//基于上一次说的内容 ,我们来弄下获取联系人详细信息,直接上代码,在第三篇补上其他的操作

package org.mo.pmas.resolver;
//本文章归属于小黑_mo所有,转载请说明出来http://my.oschina.net/moziqi/
import android.content.ContentResolver;
import android.content.ContentUris;
import android.content.Context;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.provider.ContactsContract;
import android.util.Log;
import org.mo.pmas.activity.R;
import org.mo.pmas.entity.Contact;
import org.mo.pmas.entity.Phone;

import java.io.IOException;
import java.io.InputStream;
import java.util.ArrayList;
import java.util.List;

/**
 * Created by moziqi on 2015/1/9 0009.
 */
public class ContactResolver implements BaseResolver<Contact> {
    private Context mContext;

    public ContactResolver(Context mContext) {
        this.mContext = mContext;
    }

    @Override
    public boolean save(Contact entity) {
        return false;
    }

    @Override
    public boolean update(Contact entity) {
        return false;
    }

    @Override
    public boolean delete(Contact entity) {
        return false;
    }

    @Override
    public List<Contact> findAll() {
        List<Contact> contacts = new ArrayList<Contact>();
        ContentResolver contentResolver = mContext.getContentResolver();
        Cursor cursor = contentResolver.query(
                ContactsContract.Contacts.CONTENT_URI,
                null,
                null,
                null,
                ContactsContract.Contacts.DISPLAY_NAME
                        + " COLLATE LOCALIZED ASC");
        if (cursor.moveToFirst()) {
            do {
                Contact contact = new Contact();
                // 获得联系人的ID号
                int contactId = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts._ID));
                // 获得联系人姓名
                String contactName = cursor.getString(cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME));

                //获取联系人生日
                String[] projection = new String[]{ContactsContract.CommonDataKinds.Event.DATA1};
                String selection = ContactsContract.Data.MIMETYPE
                        + "=‘"
                        + ContactsContract.CommonDataKinds.Event.CONTENT_ITEM_TYPE
                        + "‘"
                        + " and "
                        + ContactsContract.CommonDataKinds.Event.TYPE
                        + "=‘"
                        + ContactsContract.CommonDataKinds.Event.TYPE_BIRTHDAY
                        + "‘"
                        + " and "
                        + ContactsContract.CommonDataKinds.Event.CONTACT_ID
                        + " = " + contactId;
                Cursor birthdayCursor = mContext.getContentResolver().query(
                        ContactsContract.Data.CONTENT_URI,
                        projection,
                        selection,
                        null,
                        null);
                String birthday = null;
                if (birthdayCursor.moveToFirst()) {
                    birthday = birthdayCursor.getString(birthdayCursor.getColumnIndex(ContactsContract.CommonDataKinds.Event.DATA));
                }
                birthdayCursor.close();

                //得到联系人头像Bitamp
                Bitmap contactPhoto = null;
                //得到联系人头像ID
                int photoid = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts.PHOTO_ID));
                //photoid 大于0 表示联系人有头像 如果没有给此人设置头像则给他一个默认的
                if (photoid > 0) {
                    Uri uri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, (long) contactId);
                    InputStream input = ContactsContract.Contacts.openContactPhotoInputStream(mContext.getContentResolver(), uri);
                    contactPhoto = BitmapFactory.decodeStream(input);
                    try {
                        input.close();
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
                } else {
                    contactPhoto = BitmapFactory.decodeResource(mContext.getResources(), R.drawable.h001);
                }

                // 获取该联系人邮箱
                //我这里只需要获取一个,没有遍历全部出来
                Cursor cursorEmail = mContext.getContentResolver().query(
                        ContactsContract.CommonDataKinds.Email.CONTENT_URI,
                        null,
                        ContactsContract.CommonDataKinds.Email.CONTACT_ID
                                + " = " + contactId, null, null);
                String email = null;
                if (cursorEmail.moveToFirst()) {
                    email = cursorEmail.getString(
                            cursorEmail.getColumnIndex(
                                    ContactsContract.CommonDataKinds.Email.DATA));
                }
                cursorEmail.close();

                // 获取该联系人地址
                //我这里只需要获取一个,没有遍历全部出来
                Cursor cursorAddress = mContext.getContentResolver().query(
                        ContactsContract.CommonDataKinds.StructuredPostal.CONTENT_URI,
                        null,
                        ContactsContract.CommonDataKinds.StructuredPostal.CONTACT_ID
                                + " = " + contactId, null, null);
                String address = null;
                if (cursorAddress.moveToFirst()) {
                    //获取CITY
                    address = cursorAddress.getString(cursorAddress.getColumnIndex(ContactsContract.CommonDataKinds.StructuredPostal.CITY));
                }
                cursorAddress.close();

                contact.setId(contactId);
                contact.setName(contactName);
                contact.setContactPhoto(contactPhoto);
                contact.setEmail(email);
                contact.setAddress(address);
                contact.setBirthday(birthday);

                // 查看该联系人有多少个电话号码。如果没有这返回值为0
                int has_phone_number = cursor.getInt(cursor.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
                if (has_phone_number > 0) {
                    // 获得联系人的电话号码
                    Cursor cursorPhone = mContext.getContentResolver().query(
                            ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                            null,
                            ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                                    + " = " + contactId, null, null);
                    List<Phone> phones = new ArrayList<Phone>();
                    if (cursorPhone.moveToFirst()) {
                        do {
                            Phone phone = new Phone();
                            int phoneId = cursorPhone.getInt(
                                    cursorPhone.getColumnIndex(
                                            ContactsContract.CommonDataKinds.Phone._ID));
                            String phoneNumber = cursorPhone.getString(
                                    cursorPhone.getColumnIndex(
                                            ContactsContract.CommonDataKinds.Phone.NUMBER));
                            phone.setContact(contact);
                            phone.setId(phoneId);
                            phone.setPhoneNumber(phoneNumber);
                            //保存phone list集合
                            phones.add(phone);
                        } while (cursorPhone.moveToNext());
                    }
                    cursorPhone.close();
                    //如果有电话号码就把phones添加到contact上
                    contact.setPhones(phones);
                }

                contacts.add(contact);
            } while (cursor.moveToNext());
        }
        cursor.close();
        return contacts;
    }
}

//另外2个bean类

public class Contact implements Serializable {

    private Integer id;//编号

    private String name;//名字

    private String birthday;//生日

    private String email;//邮箱地址

    private String address;//通讯地址

    private Bitmap contactPhoto;//联系人照片

    private String phoneNumber;//联系电话

    private String sortLetters;  //显示数据拼音的首字母

    private String contactGroup;//联系组名称

    private String objectId;

    private String createdAt;

    private ContactGroup mContactGroup;

    private MyUser myUser;

    private List<Phone> phones;
    
    //getset
 }
package org.mo.pmas.entity;

import android.os.Parcel;
import android.os.Parcelable;

import java.io.Serializable;

/**
 * Created by moziqi on 2015/1/9 0009.
 */
public class Phone implements Serializable {

    private Integer id;
    private String objectId;
    private String phoneNumber;
    private Contact contact;
    private MyUser myUser;

    public Integer getId() {
        return id;
    }

    public void setId(Integer id) {
        this.id = id;
    }

    public String getObjectId() {
        return objectId;
    }

    public void setObjectId(String objectId) {
        this.objectId = objectId;
    }

    public String getPhoneNumber() {
        return phoneNumber;
    }

    public void setPhoneNumber(String phoneNumber) {
        this.phoneNumber = phoneNumber;
    }

    public Contact getContact() {
        return contact;
    }

    public void setContact(Contact contact) {
        this.contact = contact;
    }

    public MyUser getMyUser() {
        return myUser;
    }

    public void setMyUser(MyUser myUser) {
        this.myUser = myUser;
    }

    @Override
    public String toString() {
        return "Phone{" +
                "phoneNumber=‘" + phoneNumber + ‘\‘‘ +
                ", objectId=‘" + objectId + ‘\‘‘ +
                ", id=" + id +
                ‘}‘;
    }
}

参考内容http://www.verydemo.com/demo_c131_i81641.html

http://www.eoeandroid.com/thread-24595-1-1.html

时间: 2024-12-22 06:11:12

(android)解剖contentProvider获取通讯录列表-002的相关文章

Android 开发 ContentProvider 获取歌曲列表和联系人的样例

ContentProvider(内容提供者)是Android中的四大组件之中的一个. 主要用于对外共享数据.也就是通过ContentProvider把应用中的数据共享给其它应用訪问.其它应用能够通过ContentProvider对指定应用中的数据进行操作.ContentProvider分为系统的和自己定义的,系统的也就是比如联系人,图片等数据. 下面这段是Google Doc中对ContentProvider的大致概述. 内容提供者将一些特定的应用程序数据供给其他应用程序使用. 数据能够存储于文

Android 开发 ContentProvider 获取歌曲列表和联系人的例子

ContentProvider(内容提供者)是Android中的四大组件之一.主要用于对外共享数据,也就是通过ContentProvider把应用中的数据共享给其他应用访问,其他应用可以通过ContentProvider对指定应用中的数据进行操作.ContentProvider分为系统的和自定义的,系统的也就是例如联系人,图片等数据. 以下这段是Google Doc中对ContentProvider的大致概述. 内容提供者将一些特定的应用程序数据供给其它应用程序使用.数据可以存储于文件系统.SQ

【翻译】通讯录数据的存取(一)——获取通讯录列表

通讯录数据的存取 有选择性的翻译自:https://developer.android.com/training/contacts-provider/index.html Contacts Provider是用户通信信息仓库,包含通讯录应用程序和社交网络应用程序的数据.我们可以通过直接调用ContactsResolver的方法或直接发送调用通讯录应用程序的intent来获取Contacts Provider提供的信息. 目录 通讯录数据的存取 目录 获取通讯录列表 匹配通信人姓名 定义ListV

用ContentProvider获取通讯录联系人

手机中的联系人数据实际是保存在数据库中的,但Android并没有让我们通过操作数据库去读取数据,而是通过一个ContractProvider这个应用提供了一个ContentProvider访问接口. 获取email的方法与获取电话号码相同. 具体实现过程如下: 添加应用权限: <uses-permission android:name="android.permission.READ_CONTACTS" /> <uses-permission android:name

React Native之获取通讯录信息并实现类通讯录列表(ios android)

React Native之获取通讯录信息并实现类通讯录列表(ios android) 一,需求分析 1,获取通讯录信息,筛选出通讯录里有多少好友在使用某个应用. 2,获取通讯录信息,实现类通讯录,可拨打电话 发短信等. 二,技术介绍与配置 2.1 技术介绍 1,react-native-contacts地址:https://www.npmjs.com/package/react-native-contacts 2,下载安装:npm install react-native-contacts --

Android开发之获取手机通讯录

获取手机通讯录是Android最常用的小功能,今天自学到了,记下来,主要是通过系统自带的内容提供者提供的数据,我们使用内容接收者获取相应的数据到cursor中,然后获取对应data表中的字段,相关字段代表什么含义,只能自己去查了. 下面是手机通讯录列表的代码,仅供参考: package com.andy.phonecontact; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import

Android手机获取通讯录联系人信息及短信广播实现

现在越来越多的android应用在注册时都要用到手机号码,通过获取手机验证码来完成注册.也有不少应用提供了手机通讯录备份功能,获得你的允许后把你的通讯录中的手机号码保存到服务器中,你要的时候又可以down下来,比如微信,QQ等就有这们的功能.那我们怎么样获取用户通讯录中的手机号码呢?Android已经为我们做好了准备: ---------------------------------获取通讯录联系人信息----------------------------------------------

android 获取相册列表的实现(三)

该项目实现的功能如下: 获取手机相册,点击每个相册之后进入该相册的图片列表界面,在图片列表界面可以实现图片多选,然后进入所选择的图片界面,在该界面内可以实现所选图片的上传等功能. 该项目最大特色: 1.获取相册列表,目前网络上面介绍获取相册的项目很少,本文专门讲述相册的获取. 2.使用Android-Universal-Image-Loader集成框架-第三方jar包加载本地图片,熟悉这个jar的开发者肯定不陌生,该jar包十分强大,除了可以获取网络图片,本地图片也是可以的.同时,通过引用第三方

android 获取相册列表的实现(二)

该项目实现的功能如下: 获取手机相册,点击每个相册之后进入该相册的图片列表界面,在图片列表界面可以实现图片多选,然后进入所选择的图片界面,在该界面内可以实现所选图片的上传等功能. 该项目最大特色: 1.获取相册列表,目前网络上面介绍获取相册的项目很少,本文专门讲述相册的获取. 2.使用Android-Universal-Image-Loader集成框架-第三方jar包加载本地图片,熟悉这个jar的开发者肯定不陌生,该jar包十分强大,除了可以获取网络图片,本地图片也是可以的.同时,通过引用第三方