|
|
|
@ -91,3 +91,29 @@ public class Contact { // 定义 Contact 类
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
/*
|
|
|
|
|
缓存检查:
|
|
|
|
|
|
|
|
|
|
首先检查 sContactCache 是否已初始化,如果未初始化,则创建一个新的 HashMap。
|
|
|
|
|
然后检查缓存中是否已经存有该电话号码的联系人姓名。如果有,直接返回缓存中的结果。
|
|
|
|
|
查询联系人:
|
|
|
|
|
|
|
|
|
|
如果缓存中没有该联系人,构建一个查询条件 selection,并用 PhoneNumberUtils.toCallerIDMinMatch(phoneNumber) 方法将 + 符号替换为号码的最小匹配形式。
|
|
|
|
|
通过 context.getContentResolver().query 方法查询联系人数据库,查询条件是 selection,查询的列为联系人显示姓名(Phone.DISPLAY_NAME)。
|
|
|
|
|
结果处理:
|
|
|
|
|
|
|
|
|
|
如果查询返回有效的游标(即找到联系人信息),则尝试获取第一个结果的联系人姓名。
|
|
|
|
|
将获取到的联系人姓名缓存起来,方便下次快速查询。
|
|
|
|
|
错误处理:
|
|
|
|
|
|
|
|
|
|
如果发生异常(例如游标获取数据时出现 IndexOutOfBoundsException),则记录错误日志并返回 null。
|
|
|
|
|
如果查询没有返回任何联系人数据,则记录调试日志,并返回 null。
|
|
|
|
|
资源释放:
|
|
|
|
|
|
|
|
|
|
确保游标在操作完成后关闭,以释放数据库资源。
|
|
|
|
|
总结
|
|
|
|
|
这段代码的功能是通过电话号码查询并返回对应的联系人姓名。为了提高效率,查询结果会被缓存,以避免重复查询数据库。代码充分利用了 ContentResolver 进行联系人数据的查询,并在出现问题时进行了异常处理和日志记录。
|
|
|
|
|
|
|
|
|
|
*/
|