|  |  | @ -26,9 +26,11 @@ import android.util.Log; | 
			
		
	
		
		
			
				
					
					|  |  |  | import java.util.HashMap; |  |  |  | import java.util.HashMap; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  | public class Contact { |  |  |  | public class Contact { | 
			
		
	
		
		
			
				
					
					|  |  |  |     private static HashMap<String, String> sContactCache; |  |  |  |     private static HashMap<String, String> sContactCache;//静态哈希表,用于缓存已查询的电话号码和对应的联系人姓名
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |     private static final String TAG = "Contact"; |  |  |  |     private static final String TAG = "Contact";// 日志标签,用于标识日志来源
 | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     // 查询联系人的SQL语句模板,使用PHONE_NUMBERS_EQUAL函数比较电话号码
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |     // 查找匹配给定电话号码的联系人,并确保数据类型是Ph
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     private static final String CALLER_ID_SELECTION = "PHONE_NUMBERS_EQUAL(" + Phone.NUMBER |  |  |  |     private static final String CALLER_ID_SELECTION = "PHONE_NUMBERS_EQUAL(" + Phone.NUMBER | 
			
		
	
		
		
			
				
					
					|  |  |  |     + ",?) AND " + Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'" |  |  |  |     + ",?) AND " + Data.MIMETYPE + "='" + Phone.CONTENT_ITEM_TYPE + "'" | 
			
		
	
		
		
			
				
					
					|  |  |  |     + " AND " + Data.RAW_CONTACT_ID + " IN " |  |  |  |     + " AND " + Data.RAW_CONTACT_ID + " IN " | 
			
		
	
	
		
		
			
				
					|  |  | @ -36,17 +38,21 @@ public class Contact { | 
			
		
	
		
		
			
				
					
					|  |  |  |             + " FROM phone_lookup" |  |  |  |             + " FROM phone_lookup" | 
			
		
	
		
		
			
				
					
					|  |  |  |             + " WHERE min_match = '+')"; |  |  |  |             + " WHERE min_match = '+')"; | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |      // 根据电话号码获取联系人姓名的静态方法
 | 
			
		
	
		
		
			
				
					
					|  |  |  |     public static String getContact(Context context, String phoneNumber) { |  |  |  |     public static String getContact(Context context, String phoneNumber) { | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(sContactCache == null) { |  |  |  |         if(sContactCache == null) { | 
			
		
	
		
		
			
				
					
					|  |  |  |             sContactCache = new HashMap<String, String>(); |  |  |  |             sContactCache = new HashMap<String, String>(); | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // 检查缓存中是否已有该电话号码的联系人信息
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if(sContactCache.containsKey(phoneNumber)) { |  |  |  |         if(sContactCache.containsKey(phoneNumber)) { | 
			
		
	
		
		
			
				
					
					|  |  |  |             return sContactCache.get(phoneNumber); |  |  |  |             return sContactCache.get(phoneNumber); | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |         // 替换SQL模板中的"+"为实际的最小匹配值,以适应不同格式的电话号码
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         String selection = CALLER_ID_SELECTION.replace("+", |  |  |  |         String selection = CALLER_ID_SELECTION.replace("+", | 
			
		
	
		
		
			
				
					
					|  |  |  |                 PhoneNumberUtils.toCallerIDMinMatch(phoneNumber)); |  |  |  |                 PhoneNumberUtils.toCallerIDMinMatch(phoneNumber)); | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |          // 执行联系人数据库查询,获取匹配的联系人姓名
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         Cursor cursor = context.getContentResolver().query( |  |  |  |         Cursor cursor = context.getContentResolver().query( | 
			
		
	
		
		
			
				
					
					|  |  |  |                 Data.CONTENT_URI, |  |  |  |                 Data.CONTENT_URI, | 
			
		
	
		
		
			
				
					
					|  |  |  |                 new String [] { Phone.DISPLAY_NAME }, |  |  |  |                 new String [] { Phone.DISPLAY_NAME }, | 
			
		
	
	
		
		
			
				
					|  |  | @ -54,18 +60,22 @@ public class Contact { | 
			
		
	
		
		
			
				
					
					|  |  |  |                 new String[] { phoneNumber }, |  |  |  |                 new String[] { phoneNumber }, | 
			
		
	
		
		
			
				
					
					|  |  |  |                 null); |  |  |  |                 null); | 
			
		
	
		
		
			
				
					
					|  |  |  | 
 |  |  |  | 
 | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  | 			// 处理查询结果
 | 
			
		
	
		
		
			
				
					
					|  |  |  |         if (cursor != null && cursor.moveToFirst()) { |  |  |  |         if (cursor != null && cursor.moveToFirst()) { | 
			
		
	
		
		
			
				
					
					|  |  |  |             try { |  |  |  |             try { | 
			
		
	
		
		
			
				
					
					|  |  |  |                 String name = cursor.getString(0); |  |  |  |                 String name = cursor.getString(0);//获取联系人姓名
 | 
			
				
				
			
		
	
		
		
			
				
					
					|  |  |  |                 sContactCache.put(phoneNumber, name); |  |  |  |                 sContactCache.put(phoneNumber, name);// 将结果存入缓存
 | 
			
				
				
			
		
	
		
		
	
		
		
	
		
		
			
				
					
					|  |  |  |                 return name; |  |  |  |                 return name; | 
			
		
	
		
		
			
				
					
					|  |  |  |             } catch (IndexOutOfBoundsException e) { |  |  |  |             } catch (IndexOutOfBoundsException e) { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |               // 处理可能的索引越界异常
 | 
			
		
	
		
		
			
				
					
					|  |  |  |                 Log.e(TAG, " Cursor get string error " + e.toString()); |  |  |  |                 Log.e(TAG, " Cursor get string error " + e.toString()); | 
			
		
	
		
		
			
				
					
					|  |  |  |                 return null; |  |  |  |                 return null; | 
			
		
	
		
		
			
				
					
					|  |  |  |             } finally { |  |  |  |             } finally { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |               // 确保游标被关闭,避免资源泄漏
 | 
			
		
	
		
		
			
				
					
					|  |  |  |                 cursor.close(); |  |  |  |                 cursor.close(); | 
			
		
	
		
		
			
				
					
					|  |  |  |             } |  |  |  |             } | 
			
		
	
		
		
			
				
					
					|  |  |  |         } else { |  |  |  |         } else { | 
			
		
	
		
		
			
				
					
					|  |  |  |  |  |  |  |           // 没有找到匹配的联系人
 | 
			
		
	
		
		
			
				
					
					|  |  |  |             Log.d(TAG, "No contact matched with number:" + phoneNumber); |  |  |  |             Log.d(TAG, "No contact matched with number:" + phoneNumber); | 
			
		
	
		
		
			
				
					
					|  |  |  |             return null; |  |  |  |             return null; | 
			
		
	
		
		
			
				
					
					|  |  |  |         } |  |  |  |         } | 
			
		
	
	
		
		
			
				
					|  |  | 
 |