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.
xiaomibianqian/Contact.java

88 lines
4.4 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.

/*
* 版权所有 (c) 2010-2011MiCode 开源社区 (www.micode.net)
*
* 根据 Apache 许可证第 2.0 版(“许可证”)许可;
* 您不能使用此文件,除非遵守该许可证。
* 您可以在以下网址获得许可证副本:
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* 除非适用法律要求或书面同意,否则根据许可证分发的软件是按“原样”提供的,
* 不附带任何明示或暗示的担保或条件。
* 有关许可证下的权限和限制,请参见许可证。
*/
package net.micode.notes.data; // 声明包名,表示这是联系人数据的包
import android.content.Context; // 导入 Context 类,以访问应用程序的环境
import android.database.Cursor; // 导入 Cursor 类,用于操作数据库查询结果
import android.provider.ContactsContract.CommonDataKinds.Phone; // 导入 Phone 类,以访问联系人电话数据
import android.provider.ContactsContract.Data; // 导入 Data 类,以访问联系人数据
import android.telephony.PhoneNumberUtils; // 导入 PhoneNumberUtils 类,以提供电话相关的实用方法
import android.util.Log; // 导入 Log 类,用于记录日志信息
import java.util.HashMap; // 导入 HashMap 类,用于存储联系人信息的缓存
public class Contact {
private static HashMap<String, String> sContactCache; // 静态 HashMap用于缓存电话号码和对应的联系人名称
private static final String TAG = "Contact"; // 日志标签,用于标识日志信息
// 用于通过电话号码查询联系人的 SQL 选择条件
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 = '+')";
/**
* 根据提供的电话号码获取联系人的显示名称。
* @param context 用于访问内容解析器的上下文。
* @param phoneNumber 要检索的联系人的电话号码。
* @return 联系人的显示名称,如果未找到则返回 null。
*/
public static String getContact(Context context, String phoneNumber) {
// 检查缓存是否为空,如果为空,则初始化缓存
if(sContactCache == null) {
sContactCache = new HashMap<String, String>(); // 创建一个新的 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, // 查询的内容 URI
new String[] { Phone.DISPLAY_NAME }, // 要返回的列,这里只返回联系人名称
selection, // 选择条件
new String[] { phoneNumber }, // 查询参数(电话号码)
null); // 附加查询选项,通常为 null
// 检查 Cursor 是否不为空且有结果
if (cursor != null && cursor.moveToFirst()) {
try {
// 获取查询结果中的联系人名称
String name = cursor.getString(0); // 从 Cursor 中获取第一个字段,即联系人名称
sContactCache.put(phoneNumber, name); // 将获取到的联系人名称存入缓存
return name; // 返回联系人名称
} catch (IndexOutOfBoundsException e) {
// 处理索引超出范围异常
Log.e(TAG, "Cursor get string error " + e.toString()); // 记录错误日志
return null; // 返回 null
} finally {
cursor.close(); // 确保 Cursor 在使用后关闭,以释放资源
}
} else {
// 如果没有找到匹配的联系人,记录调试信息
Log.d(TAG, "No contact matched with number:" + phoneNumber);
return null; // 返回 null
}
}
}