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;