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.
miNote2/java/net/micode/notes/data/Contact.java

96 lines
3.9 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.

/*
* Copyright (c) 2010-2011, The MiCode Open Source Community (www.micode.net)
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
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";
// 查询联系人姓名的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>();
}
// 检查缓存中是否已存在该电话号码对应的联系人姓名
if (sContactCache.containsKey(phoneNumber)) {
return sContactCache.get(phoneNumber);
}
// 替换SQL语句模板中的占位符生成最终的查询语句
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()) {
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 {
// 未找到匹配的联系人,记录日志
Log.d(TAG, "No contact matched with number:" + phoneNumber);
return null;
}
}
}