You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

81 lines
3.7 KiB

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

/**
* 该类实现了通过电话号码查询联系人信息的功能,包括:
* 从联系人数据库中获取与特定电话号码相关联的显示名称。
* 使用缓存机制减少数据库查询次数,提高性能。
* 根据电话号码格式化查询条件,并执行数据库查询操作。
* 处理查询结果,将联系人名称添加到缓存中,以便下次查询时直接获取。
* 记录日志以便跟踪查询过程中的问题。
*/
package net.micode.notes.data;
import android.content.Context;
import android.database.Cursor;
import android.provider.ContactsContract.CommonDataKinds.Phone;
import android.provider.ContactsContract.Data;
import android.telephony.PhoneNumberUtils;
import android.util.Log;
import java.util.HashMap;
public class Contact {
// 缓存已查询过的电话号码和对应的联系人名称,以减少数据库查询次数。
private static HashMap<String, String> sContactCache;
private static final String TAG = "Contact";
// 用于查询具有完整国际号码格式的电话号码的selection字符串。
private static final String CALLER_ID_SELECTION = "PHONE_NUMBERS_EQUAL(" + Phone.NUMBER
+ ",?) AND " + Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'"
+ " AND " + Data.RAW_CONTACT_ID + " IN "
+ "(SELECT raw_contact_id "
+ " FROM phone_lookup"
+ " WHERE min_match = '+')";
public static String getContact(Context context, String phoneNumber) {
//这段代码是一个联系人管理类,用于获取手机联系人的信息。它通过提供一个静态方法 getContact 来获取指定手机号码对应的联系人姓名
// 初始化或获取联系人缓存
if (sContactCache == null) {
sContactCache = new HashMap<String, String>();
}
// 从缓存中直接获取联系人名称,如果存在。
if (sContactCache.containsKey(phoneNumber)) {
return sContactCache.get(phoneNumber);
}
// 使用PhoneNumberUtils将电话号码格式化为适合查询的形式
String selection = CALLER_ID_SELECTION.replace("+",//构造一个需要查询的联系人名
PhoneNumberUtils.toCallerIDMinMatch(phoneNumber));
// 执行查询以获取与电话号码相关联的联系人名称
Cursor cursor = context.getContentResolver().query(
Data.CONTENT_URI,
new String[]{Phone.DISPLAY_NAME},
selection,
new String[]{phoneNumber},
null);
if (cursor != null && cursor.moveToFirst()) {
//查询成功且有结果,就从 Cursor 中获取联系人姓名,并将结果存入 sContactCache 中作为缓存
try {
// 从查询结果中获取联系人名称并加入缓存
String name = cursor.getString(0);
sContactCache.put(phoneNumber, name);
return name;
} catch (IndexOutOfBoundsException e) {
// 查询结果异常的情况
Log.e(TAG, " Cursor get string error " + e.toString());
return null;
} finally {
cursor.close();
// 关闭游标
}
} else {
// 如果查询失败或无结果则返回null
Log.d(TAG, "No contact matched with number:" + phoneNumber);
return null;
}
}
}
/*首先检查一个静态哈希表 ContactCache 中是否已经存在该手机号码的联系人信息,
如果存在,则直接返回缓存的结果。如果不存在,则根据给定的手机号码查询系统数据库,获取联系人姓名*/