diff --git a/app/src/main/java/com/idormy/sms/forwarder/utils/PhoneUtils.kt b/app/src/main/java/com/idormy/sms/forwarder/utils/PhoneUtils.kt index 55672877..e54d63e0 100644 --- a/app/src/main/java/com/idormy/sms/forwarder/utils/PhoneUtils.kt +++ b/app/src/main/java/com/idormy/sms/forwarder/utils/PhoneUtils.kt @@ -31,6 +31,7 @@ import com.xuexiang.xutil.data.DateUtils import com.xuexiang.xutil.resource.ResUtils.getString import java.text.SimpleDateFormat import java.util.Locale +import kotlin.math.min @Suppress("DEPRECATION") class PhoneUtils private constructor() { @@ -339,7 +340,7 @@ class PhoneUtils private constructor() { //获取联系人列表 fun getContactInfoList( - limit: Int, offset: Int, phoneNumber: String?, name: String? + limit: Int, offset: Int, phoneNumber: String?, name: String?, isFuzzy: Boolean = true ): MutableList { val contactInfoList: MutableList = mutableListOf() @@ -348,7 +349,11 @@ class PhoneUtils private constructor() { val selectionArgs = ArrayList() if (!TextUtils.isEmpty(phoneNumber)) { selection += " and replace(replace(" + ContactsContract.CommonDataKinds.Phone.NUMBER + ",' ',''),'-','') like ?" - selectionArgs.add("%$phoneNumber%") + if (isFuzzy) { + selectionArgs.add("%$phoneNumber%") + } else { + selectionArgs.add("%$phoneNumber") + } } if (!TextUtils.isEmpty(name)) { selection += " and " + ContactsContract.CommonDataKinds.Phone.DISPLAY_NAME + " like ?" @@ -396,7 +401,61 @@ class PhoneUtils private constructor() { fun getContactByNumber(phoneNumber: String?): MutableList { val contactInfoList = mutableListOf() if (TextUtils.isEmpty(phoneNumber)) return contactInfoList - return getContactInfoList(1, 0, phoneNumber, null) + + // 去除国际区号、空格、括号、横线等字符 + val normalizedInputNumber = if (phoneNumber!!.startsWith("+") && phoneNumber.length > 4) { + phoneNumber.substring(4).replace("[^0-9]".toRegex(), "") + } else { + phoneNumber.replace("[^0-9]".toRegex(), "") + } + + contactInfoList.addAll(getContactInfoList(99, 0, normalizedInputNumber, null, false)) + if (contactInfoList.isEmpty() || contactInfoList.size == 1) { + return contactInfoList + } + + // 计算每个联系人的匹配长度和优先级 + val scoredContacts = contactInfoList.map { contact -> + //去除空格、括号、横线等字符 + val normalizedContactNumber = contact.phoneNumber.replace("[^0-9]".toRegex(), "") + val matchLength = calculateMatchLength(normalizedInputNumber, normalizedContactNumber) + // 优先级规则: + // 1. 完全匹配(输入手机号与联系人手机号完全一致):优先级 2 + // 2. 匹配长度等于输入手机号长度:优先级 1 + // 3. 其他情况:优先级 0 + val priority = when { + normalizedInputNumber == normalizedContactNumber -> 2 + matchLength == normalizedInputNumber.length -> 1 + else -> 0 + } + contact to Pair(matchLength, priority) + }.sortedWith(compareByDescending>> { it.second.first } // 按匹配长度降序 + .thenByDescending { it.second.second }) // 按优先级降序 + + // 返回匹配长度最长且优先级最高的联系人列表 + val maxMatchLength = scoredContacts.first().second.first + val maxPriority = scoredContacts.first().second.second + return scoredContacts + .filter { it.second.first == maxMatchLength && it.second.second == maxPriority } + .map { it.first } + .toMutableList() + } + + // 计算从右向左的匹配长度 + private fun calculateMatchLength(number1: String, number2: String): Int { + var matchLength = 0 + val minLength = min(number1.length, number2.length) + + // 从右向左逐位比较 + for (i in 1..minLength) { + if (number1[number1.length - i] == number2[number2.length - i]) { + matchLength++ + } else { + break // 遇到不匹配的字符,停止比较 + } + } + + return matchLength } //获取通话记录转发内容 @@ -590,4 +649,4 @@ class PhoneUtils private constructor() { init { throw UnsupportedOperationException("u can't instantiate me...") } -} \ No newline at end of file +}