From c63a5c46fd02bd412674502cce59aaee4f04cbde Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Tue, 16 Dec 2025 20:16:52 +0800 Subject: [PATCH 1/2] =?UTF-8?q?refactor(permissions):=20=E5=BA=94=E5=B9=BF?= =?UTF-8?q?=E5=A4=A7=E5=B9=B3=E5=8F=B0=E7=9A=84=E8=A6=81=E6=B1=82=EF=BC=8C?= =?UTF-8?q?=E7=A7=BB=E9=99=A4=E7=9F=AD=E4=BF=A1=E6=9D=83=E9=99=90=E7=9B=B8?= =?UTF-8?q?=E5=85=B3=E4=BB=A3=E7=A0=81?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 移除不再需要的短信权限请求和相关处理逻辑,改为使用Intent系统短信应用发送短信 --- lib/data/services/novice_guide_service.dart | 7 ---- .../controllers/permissions_controller.dart | 1 - .../permissions/models/permission_group.dart | 2 +- .../chat_api/SystemFunctionHandler.kt | 38 +++++++------------ .../android/AndroidManifest.xml | 4 +- .../open_ai_service/SystemFunctionHandler.kt | 27 ++++++------- 6 files changed, 29 insertions(+), 50 deletions(-) diff --git a/lib/data/services/novice_guide_service.dart b/lib/data/services/novice_guide_service.dart index 7fbcefecf..10e9195a2 100644 --- a/lib/data/services/novice_guide_service.dart +++ b/lib/data/services/novice_guide_service.dart @@ -109,13 +109,6 @@ class NoviceGuideService extends GetxService { 'endKey': 'guideSmsEnd', 'method': () async { if (Platform.isAndroid) { - // 发送短信需要短信权限 - await PermissionUtil.instance.requestPermission( - permissionType: Permission.sms, - permissionName: 'sms'.tr, // 短信 - explanationText: 'smsPermissionDesc'.tr, // 用于发送短信功能 - permanentDenialText: 'smsPermissionDetailDesc'.tr, // 发送短信功能需要短信权限 - ); //发送短信还需要联系人权限 await PermissionUtil.instance.requestPermission( permissionType: Permission.contacts, diff --git a/lib/modules/permissions/controllers/permissions_controller.dart b/lib/modules/permissions/controllers/permissions_controller.dart index fb69e9b1d..1b184a4e4 100644 --- a/lib/modules/permissions/controllers/permissions_controller.dart +++ b/lib/modules/permissions/controllers/permissions_controller.dart @@ -145,7 +145,6 @@ class PermissionsController extends GetxController { Permission.calendarFullAccess, Permission.location, Permission.phone, - Permission.sms, Permission.contacts, ...bluetoothPermissions, Permission.notification, diff --git a/lib/modules/permissions/models/permission_group.dart b/lib/modules/permissions/models/permission_group.dart index 30fddf8a5..7b7990dbe 100644 --- a/lib/modules/permissions/models/permission_group.dart +++ b/lib/modules/permissions/models/permission_group.dart @@ -49,7 +49,7 @@ class PermissionGroup { const PermissionGroupModel( titleKey: 'communicationPermissions', icon: Icons.phone_android, - permissions: [Permission.phone, Permission.sms, Permission.contacts], + permissions: [Permission.phone, Permission.contacts], ), // 蓝牙权限组 - 根据平台动态获取权限 PermissionGroupModel( diff --git a/local_plugins/chat_api/android/src/main/kotlin/com/yunqiinnovation/chat_api/SystemFunctionHandler.kt b/local_plugins/chat_api/android/src/main/kotlin/com/yunqiinnovation/chat_api/SystemFunctionHandler.kt index 94173554d..bb16bc993 100644 --- a/local_plugins/chat_api/android/src/main/kotlin/com/yunqiinnovation/chat_api/SystemFunctionHandler.kt +++ b/local_plugins/chat_api/android/src/main/kotlin/com/yunqiinnovation/chat_api/SystemFunctionHandler.kt @@ -10,12 +10,10 @@ import android.content.pm.PackageManager import android.location.LocationManager import android.media.AudioManager import android.net.Uri -import android.os.Build import android.provider.AlarmClock import android.provider.CalendarContract import android.provider.ContactsContract import android.provider.Settings -import android.telephony.SmsManager import android.util.Log import androidx.core.content.ContextCompat import com.yunqiinnovation.location_service.LocationService @@ -519,16 +517,6 @@ private class SendTextMessageHandler(private val context: Context?) : FunctionHa val handler = context.let { SystemFunctionHandler(it) } return try { - // 检查发送短信权限 - if (!handler.checkPermissionAndGuide(Manifest.permission.SEND_SMS, "发送短信", "发送短信")) { - return JSONObject().apply { - put("error", JSONObject().apply { - put("code", "permission_denied") - put("message", "需要短信权限才能发送短信,请在权限管理中开启短信权限") - }) - }.toString() - } - val phoneNumber = handler.getPhoneNumberForContact(phone_number) if (phoneNumber.isEmpty()) { return JSONObject().apply { @@ -539,24 +527,24 @@ private class SendTextMessageHandler(private val context: Context?) : FunctionHa }.toString() } - // 使用SmsManager发送短信 - val smsManager = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.S) { - context.getSystemService(SmsManager::class.java) - } else { - @Suppress("DEPRECATION") - SmsManager.getDefault() + val intent = Intent(Intent.ACTION_SENDTO).apply { + data = Uri.parse("smsto:$phoneNumber") + putExtra("sms_body", message) + flags = Intent.FLAG_ACTIVITY_NEW_TASK } - - // 处理长短信 - val parts = smsManager.divideMessage(message) - if (parts.size == 1) { - smsManager.sendTextMessage(phoneNumber, null, message, null, null) + if (context.packageManager?.queryIntentActivities(intent, 0)?.isNotEmpty() == true) { + context.startActivity(intent) } else { - smsManager.sendMultipartTextMessage(phoneNumber, null, parts, null, null) + return JSONObject().apply { + put("error", JSONObject().apply { + put("code", "no_sms_app") + put("message", "未找到可用的短信应用") + }) + }.toString() } JSONObject().apply { - put("result", "已成功向${phone_number}发送短信") + put("result", "已打开短信应用,请确认发送") put("phone", phoneNumber) put("message", message) }.toString() diff --git a/local_plugins/open_ai_service/android/AndroidManifest.xml b/local_plugins/open_ai_service/android/AndroidManifest.xml index 1d834e578..2b2696537 100644 --- a/local_plugins/open_ai_service/android/AndroidManifest.xml +++ b/local_plugins/open_ai_service/android/AndroidManifest.xml @@ -4,9 +4,7 @@ - - - \ No newline at end of file + diff --git a/local_plugins/open_ai_service/android/src/main/kotlin/com/yunqiinnovation/open_ai_service/SystemFunctionHandler.kt b/local_plugins/open_ai_service/android/src/main/kotlin/com/yunqiinnovation/open_ai_service/SystemFunctionHandler.kt index 3117bffa6..845b60d23 100644 --- a/local_plugins/open_ai_service/android/src/main/kotlin/com/yunqiinnovation/open_ai_service/SystemFunctionHandler.kt +++ b/local_plugins/open_ai_service/android/src/main/kotlin/com/yunqiinnovation/open_ai_service/SystemFunctionHandler.kt @@ -13,7 +13,6 @@ import android.provider.AlarmClock import android.provider.CalendarContract import android.provider.MediaStore import android.provider.Settings -import android.telephony.SmsManager import android.util.Log import org.json.JSONObject import kotlinx.coroutines.suspendCancellableCoroutine @@ -761,29 +760,31 @@ class SystemFunctionHandler(private val context: Context) { Log.d(TAG, "发送短信给 $contact: $message") try { - // 检查发送短信权限 - if (!checkPermissionAndGuide(Manifest.permission.SEND_SMS, "发送短信", "发送短信")) { + val phoneNumber = getPhoneNumberForContact(contact) + if (phoneNumber.isEmpty()) { return Result( success = false, - message = "需要短信权限才能发送短信,请在权限管理中开启短信权限" + message = "未找到联系人信息: $contact" ) } - val phoneNumber = getPhoneNumberForContact(contact) - if (phoneNumber.isEmpty()) { + val intent = Intent(Intent.ACTION_SENDTO).apply { + data = Uri.parse("smsto:$phoneNumber") + putExtra("sms_body", message) + flags = Intent.FLAG_ACTIVITY_NEW_TASK + } + if (intent.resolveActivity(context.packageManager) != null) { + context.startActivity(intent) + } else { return Result( success = false, - message = "未找到联系人信息: $contact" + message = "未找到可用的短信应用" ) } - // 使用SmsManager发送短信 - val smsManager = SmsManager.getDefault() - smsManager.sendTextMessage(phoneNumber, null, message, null, null) - return Result( success = true, - message = "已向${contact}发送短信: $message" + message = "已打开短信应用,请确认发送" ) } catch (e: Exception) { Log.e(TAG, "发送短信失败: ${e.message}", e) @@ -1350,4 +1351,4 @@ class SystemFunctionHandler(private val context: Context) { val success: Boolean, val message: String ) -} \ No newline at end of file +} From 50e1a7b53cc8bd49c3624ed01acc132f7fd5960a Mon Sep 17 00:00:00 2001 From: lxm <1274844347@qq.com> Date: Wed, 17 Dec 2025 11:57:12 +0800 Subject: [PATCH 2/2] =?UTF-8?q?fix(=E8=93=9D=E7=89=99):=20=E6=B7=BB?= =?UTF-8?q?=E5=8A=A0=E8=93=9D=E7=89=99=E8=80=B3=E6=9C=BA=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E9=94=99=E8=AF=AF=E6=8F=90=E7=A4=BA=E5=B9=B6=E6=9B=B4=E6=96=B0?= =?UTF-8?q?=E7=9B=B8=E5=85=B3=E7=BF=BB=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 当蓝牙编解码打开失败时,显示更明确的错误提示信息 --- lib/core/translations/language/en_us.dart | 2 ++ lib/core/translations/language/zh_cn.dart | 1 + lib/modules/translation/controllers/translation_controller.dart | 2 +- 3 files changed, 4 insertions(+), 1 deletion(-) diff --git a/lib/core/translations/language/en_us.dart b/lib/core/translations/language/en_us.dart index 3868f975a..bfac53331 100644 --- a/lib/core/translations/language/en_us.dart +++ b/lib/core/translations/language/en_us.dart @@ -1205,6 +1205,8 @@ const Map enUS = { "selectTargetLanguage": "Select Target Language", "me": "Me", //我 "counterPart": "Counterpart", //对方 + "bluetoothCallStateError": + "Please make sure the Bluetooth headset is connected to the phone and in a call state", //请确保蓝牙耳机已连接到手机并处于通话状态 // 通用对话按钮与选项(用于统一语言选择弹窗等) // 翻译键代表的中文文本内容:取消/确认/自动检测 diff --git a/lib/core/translations/language/zh_cn.dart b/lib/core/translations/language/zh_cn.dart index 64db2449d..fd1602857 100644 --- a/lib/core/translations/language/zh_cn.dart +++ b/lib/core/translations/language/zh_cn.dart @@ -1107,6 +1107,7 @@ const Map zhCN = { "selectTargetLanguage": "选择目标语言", "me": "我", "counterPart": "对方", + "bluetoothCallStateError": "请确保蓝牙耳机已连接到手机并处于通话状态", // 通用对话按钮与选项(用于统一语言选择弹窗等) // 以下翻译键的中文文本内容如注释所示 diff --git a/lib/modules/translation/controllers/translation_controller.dart b/lib/modules/translation/controllers/translation_controller.dart index b7a06dc14..8ceb5a382 100644 --- a/lib/modules/translation/controllers/translation_controller.dart +++ b/lib/modules/translation/controllers/translation_controller.dart @@ -953,7 +953,7 @@ class TranslationController extends GetxController with WidgetsBindingObserver { } isPreparing.value = false; if (!bleManager.isCodecActive) { - Get.snackbar('tip'.tr, 'operationFailedPleaseRetry'.tr); + Get.snackbar('tip'.tr, 'bluetoothCallStateError'.tr); throw Exception('lxm--BLE编解码打开失败'); } _audioSourceType = true;