From d5cba8d4746fb59a173c150696c3b53ad3289f04 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E4=BD=95=E6=80=9D=E6=BA=90?= <1308063943@qq.com> Date: Sun, 29 Jun 2025 20:59:07 +0800 Subject: [PATCH] data/Contact.java --- .../java/net/micode/notes/data/Contact.java | 41 ++++++++++++++++++- 1 file changed, 39 insertions(+), 2 deletions(-) diff --git a/app/src/main/java/net/micode/notes/data/Contact.java b/app/src/main/java/net/micode/notes/data/Contact.java index d97ac5d..88d54ef 100644 --- a/app/src/main/java/net/micode/notes/data/Contact.java +++ b/app/src/main/java/net/micode/notes/data/Contact.java @@ -25,28 +25,59 @@ import android.util.Log; import java.util.HashMap; +/** + * 联系人信息处理类 + * 提供根据电话号码获取联系人名称的功能 + */ public class Contact { + /** + * 缓存联系人信息的哈希表 + * 键:电话号码 + * 值:联系人名称 + */ private static HashMap sContactCache; + + /** + * 日志标签 + */ private static final String TAG = "Contact"; + /** + * 查询联系人的SQL条件语句 + * 用于匹配电话号码并获取联系人名称 + * 使用PHONE_NUMBERS_EQUAL函数进行模糊匹配 + * 并限制MIME类型为Phone.CONTENT_ITEM_TYPE + * 同时限定RAW_CONTACT_ID在phone_lookup表中min_match为'+'的记录 + */ 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 " + + ",?) AND " + Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'" + + " AND " + Data.RAW_CONTACT_ID + " IN " + "(SELECT raw_contact_id " + " FROM phone_lookup" + " WHERE min_match = '+')"; + /** + * 根据电话号码获取联系人名称 + * @param context 应用程序上下文 + * @param phoneNumber 电话号码 + * @return 联系人名称,如果未找到则返回null + */ public static String getContact(Context context, String phoneNumber) { + // 初始化缓存 if(sContactCache == null) { sContactCache = new HashMap(); } + // 如果缓存中已存在该电话号码对应的联系人名称,则直接返回 if(sContactCache.containsKey(phoneNumber)) { return sContactCache.get(phoneNumber); } + // 构建查询条件,将电话号码转换为最小匹配格式 String selection = CALLER_ID_SELECTION.replace("+", PhoneNumberUtils.toCallerIDMinMatch(phoneNumber)); + + // 查询联系人信息 Cursor cursor = context.getContentResolver().query( Data.CONTENT_URI, new String [] { Phone.DISPLAY_NAME }, @@ -54,18 +85,24 @@ public class Contact { new String[] { phoneNumber }, null); + // 处理查询结果 if (cursor != null && cursor.moveToFirst()) { 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; }