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.
text123/Contact_1.java

100 lines
4.3 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;
// Contact类用于从联系人数据库中根据电话号码获取联系人姓名
public class Contact {
// 用于缓存联系人电话号码和姓名的映射关系,以提高查询效率
private static HashMap<String, String> sContactCache;
// 用于日志记录的标签
private static final String TAG = "Contact";
// 用于查询联系人姓名的SQL选择条件
// 此条件用于查找与给定电话号码匹配的联系人
// 其中PHONE_NUMBERS_EQUAL函数用于比较电话号码
// 并且要求数据类型为电话号码类型Phone.CONTENT_ITEM_TYPE
// 同时原始联系人ID需要在通过phone_lookup查询到的结果中且最小匹配为'+'
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 = '+')";
// 根据给定的上下文和电话号码获取联系人姓名
public static String getContact(Context context, String phoneNumber) {
// 如果缓存尚未初始化则创建一个新的HashMap
if (sContactCache == null) {
sContactCache = new HashMap<String, String>();
}
// 如果缓存中已经存在该电话号码对应的联系人姓名,则直接返回
if (sContactCache.containsKey(phoneNumber)) {
return sContactCache.get(phoneNumber);
}
// 根据电话号码生成符合查询条件的选择字符串
String selection = CALLER_ID_SELECTION.replace("+",
PhoneNumberUtils.toCallerIDMinMatch(phoneNumber));
// 使用ContentResolver查询联系人数据库
// 查询的URI为Data.CONTENT_URI
// 需要返回的列是Phone.DISPLAY_NAME联系人的显示名称
// 选择条件为生成的selection
// 选择参数为电话号码
// 排序方式为null默认排序
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());
// 返回null表示获取失败
return null;
} finally {
// 无论是否发生异常,都要关闭游标以释放资源
cursor.close();
}
} else {
// 如果没有找到匹配的联系人,记录调试日志
Log.d(TAG, "No contact matched with number:" + phoneNumber);
// 返回null表示没有找到匹配的联系人
return null;
}
}
}