Android获取通讯录中的所有联系人工具类

本文介绍了一个用于获取通讯录中所有联系人并根据手机号查询姓名的工具类,包括如何存储联系人信息和实现查询功能。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一个获取通讯录中所有联系人的工具类,存储在Map中,Map中key为手机号,value为联系人的姓名。还提供了一个根据手机号查询该手机号的联系人姓名的功能。

注:同一联系人可以存储多个手机号,但是同一手机号存储为多个联系人姓名的这里做了处理,只存储一个在map中

具体的代码如下:

package com.example.mycontact;

import java.util.HashMap;
import java.util.Map;

import android.content.ContentResolver;
import android.content.Context;
import android.database.Cursor;
import android.net.Uri;
import android.provider.ContactsContract;
import android.text.TextUtils;

public class ContactUtils {
	
	/**
	 * 
	 * 根据电话号码查询通讯录中的联系人姓名
	 * @param phonNum	联系人的号码
	 * @return	联系人的姓名
	 */
	public static String findNameFromContact(String phonNum,Map<String, String> allContacts){
		if(!TextUtils.isEmpty(phonNum) && allContacts != null && allContacts.size() > 0 ){
			String phone = handlePhoneNum(phonNum);//将号码处理后再进行查询
			if(allContacts.containsKey(phone)){
				return allContacts.get(phone);
			}
		}
		return null;
	} 
	
	/**
	 * 
	 * 获取通讯录中的所有联系人存储在Map中
	 * 注:Map中号码唯一作为key,号码对应的联系人作为value
	 * 对同一个号码存储多个联系人姓名的做了处理,这里只存一个姓名。即一个号码只对应一个姓名
	 * @param context
	 * @return
	 */
	public static Map<String,String> getAllContacts(Context context){
		Map<String,String> contactsMap = new HashMap<String,String>();
        //生成ContentResolver对象
        ContentResolver contentResolver = context.getContentResolver();
        // 获得所有的联系人
        /*Cursor cursor = contentResolver.query(
                ContactsContract.Contacts.CONTENT_URI, null, null, null, null);
         */
        //这段代码和上面代码是等价的,使用两种方式获得联系人的Uri
        Cursor cursor = contentResolver.query(Uri.parse("content://com.android.contacts/contacts"),null,null,null,null);
        // 循环遍历
        if (cursor.moveToFirst()) {
            int idColumn = cursor.getColumnIndex(ContactsContract.Contacts._ID);
            int displayNameColumn = cursor.getColumnIndex(ContactsContract.Contacts.DISPLAY_NAME);
            do {
                // 获得联系人的ID
                String contactId = cursor.getString(idColumn);
                // 获得联系人姓名
                String displayName = cursor.getString(displayNameColumn);
                //显示获得的联系人信息
                System.out.println("联系人姓名:" + displayName);
                // 查看联系人有多少个号码,如果没有号码,返回0
                int phoneCount = cursor.getInt(cursor
                                .getColumnIndex(ContactsContract.Contacts.HAS_PHONE_NUMBER));
                if (phoneCount > 0) {
                    // 获得联系人的电话号码列表
                    Cursor phoneCursor = context.getContentResolver().query(
                            ContactsContract.CommonDataKinds.Phone.CONTENT_URI,null,
                            ContactsContract.CommonDataKinds.Phone.CONTACT_ID
                                    + "=" + contactId, null, null);
                    if(phoneCursor.moveToFirst()){
                        do{
                            //遍历所有的联系人下面所有的电话号码
                            String phoneNumber = phoneCursor.getString(phoneCursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.NUMBER));
                            //显示获得的号码
                             System.out.println("联系人电话:"+phoneNumber);
                             if(!contactsMap.containsKey(phoneNumber)){
                            	 contactsMap.put(handlePhoneNum(phoneNumber), displayName);
                             }
                        }while(phoneCursor.moveToNext());
                    }
                }
            } while (cursor.moveToNext());
        }
        return contactsMap;
	}
	
	/**
	 * 
	 * 处理号码的方法
	 * 规则:
	 * 1、去除号码中所有的非数字
	 * 2、如果号码为13位(即手机号)就去掉86
	 * @param phoneNum 
	 * @return
	 */
	private static String handlePhoneNum(String phoneNum){
		if(!TextUtils.isEmpty(phoneNum)){
			phoneNum = phoneNum.replaceAll("\\D", "");
		}
		if(phoneNum.length() == 13 && phoneNum.startsWith("86")){
			return phoneNum.substring(2);
		}
		return phoneNum;
	}
}
下边是一个练习的小例子:有需要的可以点击免费下载

点击打开链接


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值