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.
TEST1231/作业1.txt

74 lines
3.8 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;
// 导入所需的Android和Java类
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; // 提供一个基于哈希表的Map接口实现
// 声明一个公共类Contact用于处理联系人相关的功能
public class Contact {
// 声明一个静态HashMap用于缓存电话号码到联系人名称的映射
private static HashMap<String, String> sContactCache;
// 声明一个静态常量TAG用于日志打印中的标识
private static final String TAG = "Contact";
// 声明一个静态常量CALLER_ID_SELECTION用于查询联系人时的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 = '+')";
// 声明一个公共静态方法getContact用于根据电话号码获取联系人名称
public static String getContact(Context context, String phoneNumber) {
// 如果sContactCache为空则初始化它
if(sContactCache == null) {
sContactCache = new HashMap<String, String>();
}
// 如果sContactCache中已经包含该电话号码则直接返回对应的联系人名称
if(sContactCache.containsKey(phoneNumber)) {
return sContactCache.get(phoneNumber);
}
// 根据电话号码生成查询条件替换CALLER_ID_SELECTION中的"+"为匹配的min_match值
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); // 排序规则,这里不排序
// 如果cursor不为空且至少有一条记录
if (cursor != null && cursor.moveToFirst()) {
try {
// 从cursor中获取第一条记录的联系人名称
String name = cursor.getString(0);
// 将电话号码和联系人名称存入缓存
sContactCache.put(phoneNumber, name);
// 返回联系人名称
return name;
} catch (IndexOutOfBoundsException e) {
// 如果发生索引越界异常则打印错误日志并返回null
Log.e(TAG, " Cursor get string error " + e.toString());
return null;
} finally {
// 无论是否发生异常都关闭cursor以释放资源
cursor.close();
}
} else {
// 如果没有找到匹配的联系人则打印日志并返回null
Log.d(TAG, "No contact matched with number:" + phoneNumber);
return null;
}
}
}