读取本地通讯录

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.text.TextUtils;

import com.app.common.util.Log;
import com.gzshapp.gzsh.R;

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

/**
 * 通讯录控制类 1、获取手机通讯录联系人信息 2、获取手机sim卡联系人信息
 */
public class ContactsController {
    private final String TAG = "Contact";
    /**
     * 获取库Phone表字段
     */
    private static final String[] PHONES_PROJECTION = new String[]{
            ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME,
            ContactsContract.CommonDataKinds.Phone.NUMBER,
            ContactsContract.CommonDataKinds.Photo.PHOTO_ID,
            ContactsContract.CommonDataKinds.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 Context mContext;

    public ContactsController(Context mContext) {
        this.mContext = mContext;
    }
/**
     * 获取到全部的手机联系人
     */
    public List<ContactsModel> getContact() {
        // 联系人列表
        List<ContactsModel> contactsList = new ArrayList<ContactsModel>();
        //获得所有的联系人
        Cursor cur = mContext.getContentResolver().query(ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
        //循环遍历
        if (cur.moveToFirst()) {
            int idColumn = cur.getColumnIndex(ContactsContract.Contacts._ID);
            int displayNameColumn = cur.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
            do {
                ContactsModel model = new ContactsModel();
                List<String> phoneNumbers = new ArrayList<String>();

                //获得联系人的ID号
                String contactId = cur.getString(idColumn);
                model.setContactId(Long.valueOf(contactId));
                //获得联系人姓名
                String contactName = cur.getString(displayNameColumn);
                model.setContactName(contactName);
                //查看该联系人有多少个电话号码。如果没有这返回值为0
                int phoneCount = cur.getInt(cur.getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
                if (phoneCount > 0) {
                    //获得联系人的电话号码
                    Cursor phones = mContext.getContentResolver().query(ContactsContract.CommonDataKinds.Phone.CONTENT_URI,
                            null, ContactsContract.CommonDataKinds.Phone.CONTACT_ID + " = " + contactId, null, null);
                    if (phones.moveToFirst()) {
                        do {
                            //遍历所有的电话号码
                            String phoneNumber = phones.getString(phones.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                            phoneNumbers.add(formatPhoneNumber(phoneNumber));
                            model.setPhoneNumbers(phoneNumbers);
//                            System.out.println(phoneNumber);
                        } while (phones.moveToNext());
                    }
                }
                contactsList.add(model);
            } while (cur.moveToNext());
        }
        if (null != cur) {
            cur.close();
        }
        //打印
//        print(contactsList);
        Log.e(TAG, "手机通讯录共有" + contactsList.size() + "条记录");
        return contactsList;
    }

    private void print(List<ContactsModel> contactsList) {
        for (int i = 0; i < contactsList.size(); i++) {
            String msg = contactsList.get(i).getContactName() + ":";
            List<String> phones = contactsList.get(i).getPhoneNumbers();
            String phone = "";
            if (null != phones && phones.size() > 0) {
                for (int j = 0; j < phones.size(); j++) {
                    phone += phones.get(j) + ",";
                }
            }
            msg += phone;
            System.out.println(msg);
        }
    }

    /**
     * 得到手机SIM卡联系人人信息
     */
    public List<ContactsModel> getSIMContacts() {
        // 联系人列表
        List<ContactsModel> contactsList = new ArrayList<ContactsModel>();
        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卡中没有联系人头像
                ContactsModel model = new ContactsModel();
                List<String> phoneNumbers = new ArrayList<String>();
                phoneNumbers.add(phoneNumber);
                model.setContactName(contactName);
                model.setPhoneNumbers(phoneNumbers);

                contactsList.add(model);
            }
            phoneCursor.close();
        }
        return contactsList;
    }

    /**
     * 格式化手机号码
     *
     * @param phoneNumber
     * @return
     */
    private String formatPhoneNumber(String phoneNumber) {
        //去空格
        phoneNumber = phoneNumber.replace(" ", "").trim();
        //去除+86开头的
        if (phoneNumber.startsWith("+86")) {
            phoneNumber = phoneNumber.substring(3);
        }
        //去除-
        if (phoneNumber.contains("-")) {
            phoneNumber = phoneNumber.replace("-", "").trim();
        }
        //去除区号
        if (phoneNumber.startsWith("0") &&
                (phoneNumber.length() == 11 || phoneNumber.length() == 12)) {
            phoneNumber = phoneNumber.substring(4);
        }
        return phoneNumber;
    }

    /**
     * 去除手机号码重复的
     *
     * @param contactsList
     * @return
     */
    private List<ContactsModel> megerContactsList(List<ContactsModel> contactsList) {
        for (int i = 0; i < contactsList.size(); i++) {
            ContactsModel model = contactsList.get(i);
            for (int j = contactsList.size() - 1; j > 0; j--) {
                ContactsModel tempModel = contactsList.get(j);
                if (null != tempModel && null != model) {
                    List<String> phones = model.getPhoneNumbers();
                    List<String> tempPhones = tempModel.getPhoneNumbers();
                    if (null != phones && phones.size() > 0
                            && null != tempPhones && tempPhones.size() > 0)
                        if (phones.get(0).equals(tempPhones.get(0))) {
                            contactsList.remove(j);
                        }
                }
            }
        }
        return contactsList;
    }

}
时间: 2024-08-06 07:50:41

读取本地通讯录的相关文章

iOS读取本地通讯录示例代码:

+ (NSArray *)readAllPeoples { ABAddressBookRef tmpAddressBook = nil; NSMutableArray *array = [[NSMutableArray alloc] init]; if ([[UIDevice currentDevice].systemVersion floatValue] >= 6.0) { tmpAddressBook = ABAddressBookCreateWithOptions(NULL, NULL);

UWP 读取本地XML文件

读取本地XML文件时要将xxx.xml文件的“生成操作”改为“嵌入的资源”会比较好,在手机上运行的话需要改为“内容” <?xml version="1.0" encoding="utf-8"?> <DataSet xmlns="http://WebXml.com.cn/"> <diffgr:diffgram xmlns:msdata="urn:schemas-microsoft-com:xml-msdata

读取本地数据库文件

有时候我们可以将类似省份城市的数据库文件存放在assets/文件夹名/××.sql下,当程序在创建数据库时读取该数据库文件,并执行其内的sql语句 在SqLiteOpenHelper类的onCreate方法中调用 executeAssetsSQL(db, "××.sql"); /** * 读取数据库文件(.sql),并执行sql语句 * */ private void executeAssetsSQL(SQLiteDatabase db, String schemaName) { Bu

读取本地图片写到jsp页面

//读取本地图片写到jsp页面 File file = new File("D:/parking/A区12号.jpg"); ServletOutputStream out = null; InputStream in = null; try { in = new FileInputStream(file); response().setContentType("multipart/form-data"); int tempbyte; out = response()

IOS 读取本地的Json/plist 文件

一.一般本地可以存储轻量级数据存储 plist  这个主要是操作字典 方法如下: NSString * sampleFile= [[[NSBundle mainBundle] bundlePath] stringByAppendingPathComponent:@"sections_auth=4.plist"]; NSDictionary* dic_sections = [NSDictionary dictionaryWithContentsOfFile:sampleFile]; 二.

前台JS(type=‘file’)读取本地文件的内容,兼容各种浏览器

[自己测了下,能兼容各种浏览器,但是读取中文会出现乱码.自己的解决方法是用notepad++把txt文件编码改为utf-8(应该是和浏览器编码保持一致吧?..)] 原文  http://blog.csdn.net/xwq1012/article/details/41941895 参考如下: http://blog.csdn.net/lejuo/article/details/11528243 前台JS读取本地文件内容,兼容IE7.8.9.10 FF Chrome等各种版本,纠结了好长时间,终于找

jquery读取本地文件

<html> <head> <script type="text/javascript" src="/jquery/jquery.js"></script> <script type="text/javascript"> $(document).ready(function(){ $("#b01").click(function(){ htmlobj=$.ajax({

springmvc加载xml文件读取本地properties配置文件

org.springframework.beans.factory.config.PropertyPlaceholderConfigurer.由这个类别,您可以将一些组态设定,移出至.properties档案中,如此的安排可以让XML定义档负责系统相关设定,而.properties档可 以作为客户根据需求,自定义一些相关的参数.实际上,PropertyPlaceholderConfigurer起的作用就是将占位符指向的数据库配置 信息放在bean中定义的工具. (1)使用以下方式读取单个本地文件

狂刷Android范例之5:读取手机通讯录

狂刷Android范例之5:读取手机通讯录 说明 狂刷Android范例系列文章开张了.每篇学习一个Android范例,将一个范例单独生成一个可运行的app,并对重点源代码进行简要分析.然后提供打包好的源代码下载. 功能 提供完整代码,通过ContenResolver,读取手机通讯录的内容. 代码包在此,无需下载分: http://download.csdn.net/detail/logicteamleader/8806135 来源 例子来自于Android-20的com.example.and