From 46ede050e126dd3accc99c563981029cc8dcdb34 Mon Sep 17 00:00:00 2001 From: ZhanGSKen Date: Sat, 18 Oct 2025 12:43:40 +0800 Subject: [PATCH] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=81=94=E7=B3=BB=E4=BA=BA?= =?UTF-8?q?=E7=BC=96=E8=BE=91=E8=B7=B3=E8=BD=AC=E6=8E=A5=E5=8F=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- contacts/build.gradle | 6 +- contacts/build.properties | 4 +- .../contacts/adapters/CallLogAdapter.java | 3 + .../contacts/adapters/ContactAdapter.java | 6 +- .../contacts/fragments/CallLogFragment.java | 3 +- .../studio/contacts/utils/ContactUtils.java | 96 +++++++++++++++++++ .../res/menu/toolbar_calllog_phonenumber.xml | 3 + .../res/menu/toolbar_contact_phonenumber.xml | 3 + 8 files changed, 116 insertions(+), 8 deletions(-) diff --git a/contacts/build.gradle b/contacts/build.gradle index f30c00a..eecf57d 100644 --- a/contacts/build.gradle +++ b/contacts/build.gradle @@ -18,13 +18,13 @@ def genVersionName(def versionName){ } android { - compileSdkVersion 32 - buildToolsVersion "32.0.0" + compileSdkVersion 28 + buildToolsVersion "28.0.3" defaultConfig { applicationId "cc.winboll.studio.contacts" minSdkVersion 24 - targetSdkVersion 30 + targetSdkVersion 28 versionCode 1 // versionName 更新后需要手动设置 // 项目模块目录的 build.gradle 文件的 stageCount=0 diff --git a/contacts/build.properties b/contacts/build.properties index fc971ce..a5e68d3 100644 --- a/contacts/build.properties +++ b/contacts/build.properties @@ -1,8 +1,8 @@ #Created by .winboll/winboll_app_build.gradle -#Sat Sep 27 15:23:51 HKT 2025 +#Sat Oct 18 04:38:02 GMT 2025 stageCount=18 libraryProject= baseVersion=15.3 publishVersion=15.3.17 -buildCount=0 +buildCount=6 baseBetaVersion=15.3.18 diff --git a/contacts/src/main/java/cc/winboll/studio/contacts/adapters/CallLogAdapter.java b/contacts/src/main/java/cc/winboll/studio/contacts/adapters/CallLogAdapter.java index 58444bb..13edc1e 100644 --- a/contacts/src/main/java/cc/winboll/studio/contacts/adapters/CallLogAdapter.java +++ b/contacts/src/main/java/cc/winboll/studio/contacts/adapters/CallLogAdapter.java @@ -76,6 +76,9 @@ public class CallLogAdapter extends RecyclerView.Adapter { @@ -69,6 +70,9 @@ public class ContactAdapter extends RecyclerView.Adapter 0) { + // 构建联系人的Uri(格式:content://contacts/people/[contactId],系统标准格式) + Uri contactUri = ContentUris.withAppendedId(ContactsContract.Contacts.CONTENT_URI, contactId); + intent.setData(contactUri); + } + // 场景B:未知ID,通过电话号码匹配(需系统支持号码匹配,小米机型兼容) + else if (phoneNumber != null && !phoneNumber.isEmpty()) { + // 方式1:小米等机型兼容的“通过号码定位联系人”参数(部分系统认此参数) + //intent.putExtra(ContactsContract.Intents.Insert.PHONE_NUMBER, phoneNumber); + // 方式2:补充系统标准的“数据Uri”,强化匹配(避免参数被定制系统忽略) + Uri phoneUri = Uri.withAppendedPath(ContactsContract.CommonDataKinds.Phone.CONTENT_FILTER_URI, Uri.encode(phoneNumber)); + intent.setData(phoneUri); + } else { + LogUtils.d(TAG, "编辑联系人失败:电话号码和联系人ID均为空"); + return; + } + + // 可选:预填最新号码(覆盖原有号码,若用户修改了号码,编辑时自动更新) + if (phoneNumber != null && !phoneNumber.isEmpty()) { + intent.putExtra(ContactsContract.CommonDataKinds.Phone.NUMBER, phoneNumber); + intent.putExtra(ContactsContract.CommonDataKinds.Phone.TYPE, ContactsContract.CommonDataKinds.Phone.TYPE_MOBILE); + } + + // 启动活动(加防护,避免无联系人应用崩溃) + if (intent.resolveActivity(context.getPackageManager()) != null) { + // 小米机型在Service/非Activity中调用,需加NEW_TASK标志,否则可能无法启动 + intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); + context.startActivity(intent); + } else { + LogUtils.d(TAG, "编辑联系人失败:设备未安装联系人应用"); + } + } + + /** + * 通过电话号码查询联系人ID(适配小米机型,解决编辑时匹配不稳定问题) + * @param context 上下文 + * @param phoneNumber 待查询的电话号码 + * @return 联系人ID(无匹配时返回-1) + */ + public static Long getContactIdByPhone(Context context, String phoneNumber) { + if (phoneNumber == null || phoneNumber.isEmpty()) { + return -1L; + } + + ContentResolver cr = context.getContentResolver(); + // 1. 构建电话查询Uri(系统标准:通过号码过滤联系人数据) + Uri queryUri = Uri.withAppendedPath(ContactsContract.CommonDataKinds.Phone.CONTENT_FILTER_URI, Uri.encode(phoneNumber)); + // 2. 只查询“联系人ID”字段(高效,避免冗余数据) + String[] projection = {ContactsContract.CommonDataKinds.Phone.CONTACT_ID}; + Cursor cursor = null; + + try { + cursor = cr.query(queryUri, projection, null, null, null); + if (cursor != null && cursor.moveToFirst()) { + // 3. 读取联系人ID(返回Long类型,避免int溢出) + return cursor.getLong(cursor.getColumnIndex(ContactsContract.CommonDataKinds.Phone.CONTACT_ID)); + } + } catch (Exception e) { + LogUtils.d(TAG, "查询联系人ID失败。" + e); + } finally { + if (cursor != null) { + cursor.close(); // 关闭游标,避免内存泄漏 + } + } + return -1L; // 无匹配联系人 + } + } diff --git a/contacts/src/main/res/menu/toolbar_calllog_phonenumber.xml b/contacts/src/main/res/menu/toolbar_calllog_phonenumber.xml index 1160161..429c45f 100644 --- a/contacts/src/main/res/menu/toolbar_calllog_phonenumber.xml +++ b/contacts/src/main/res/menu/toolbar_calllog_phonenumber.xml @@ -5,5 +5,8 @@ + diff --git a/contacts/src/main/res/menu/toolbar_contact_phonenumber.xml b/contacts/src/main/res/menu/toolbar_contact_phonenumber.xml index b646763..3e4a9e9 100644 --- a/contacts/src/main/res/menu/toolbar_contact_phonenumber.xml +++ b/contacts/src/main/res/menu/toolbar_contact_phonenumber.xml @@ -5,5 +5,8 @@ +