diff --git a/android/app/src/main/kotlin/com/example/deep_voice/VoiceInteractionService.kt b/android/app/src/main/kotlin/com/example/deep_voice/VoiceInteractionService.kt index 4247298df..bae43f088 100644 --- a/android/app/src/main/kotlin/com/example/deep_voice/VoiceInteractionService.kt +++ b/android/app/src/main/kotlin/com/example/deep_voice/VoiceInteractionService.kt @@ -220,9 +220,33 @@ class VoiceInteractionService : Service() { // 设置回调 mediaSession.setCallback(object : MediaSessionCompat.Callback() { override fun onMediaButtonEvent(mediaButtonEvent: Intent): Boolean { - FileLogger.d(TAG, "initMediaSession收到媒体按钮事件: $mediaButtonEvent") - handleDoubleClick() - return true + val keyEvent = if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.TIRAMISU) { + mediaButtonEvent.getParcelableExtra(Intent.EXTRA_KEY_EVENT, KeyEvent::class.java) + } else { + @Suppress("DEPRECATION") + mediaButtonEvent.getParcelableExtra(Intent.EXTRA_KEY_EVENT) as? KeyEvent + } + + if (keyEvent != null) { + // 仅处理按下操作和相关按键 + if (keyEvent.action == KeyEvent.ACTION_DOWN) { + when (keyEvent.keyCode) { + KeyEvent.KEYCODE_HEADSETHOOK, + KeyEvent.KEYCODE_MEDIA_PLAY, + KeyEvent.KEYCODE_MEDIA_PAUSE, + KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE -> { + FileLogger.d(TAG, "接收到相关媒体按钮: keyCode=${keyEvent.keyCode}") + handleDoubleClick() + return true + } + } + } + FileLogger.d(TAG, "忽略不相关媒体按钮: action=${keyEvent.action}, keyCode=${keyEvent.keyCode}") + return false + } + + FileLogger.d(TAG, "收到无按键的媒体按钮事件") + return false } override fun onPlay() { @@ -650,10 +674,8 @@ class VoiceInteractionService : Service() { if (keyEvent != null) { FileLogger.d(TAG, "从Intent中解析到按键事件: action=${keyEvent.action}, keyCode=${keyEvent.keyCode}") + // 使用统一的按键处理逻辑 handleKeyEvent(keyEvent) - } else { - FileLogger.d(TAG, "Intent中没有按键事件,直接处理双击") - handleDoubleClick() } } else if (intent?.action == ACTION_PAUSE_VOICE_INTERACTION) { // 处理来自 Flutter 的暂停请求 @@ -663,7 +685,7 @@ class VoiceInteractionService : Service() { FileLogger.d(TAG, "收到其他Intent: action=${intent?.action}") } - // 让 MediaSession 处理 Intent + // 让 MediaSession 处理 Intent,MediaSession将通过callback处理事件 try { MediaButtonReceiver.handleIntent(mediaSession, intent) FileLogger.d(TAG, "MediaButtonReceiver处理Intent完成") @@ -680,14 +702,13 @@ class VoiceInteractionService : Service() { private fun handleKeyEvent(keyEvent: KeyEvent) { FileLogger.d(TAG, "处理按键事件: action=${keyEvent.action}, keyCode=${keyEvent.keyCode}") + // 只处理按下操作和相关媒体按键 if (keyEvent.action == KeyEvent.ACTION_DOWN) { when (keyEvent.keyCode) { - KeyEvent.KEYCODE_MEDIA_PLAY -> { - FileLogger.d(TAG, "处理MEDIA_PLAY按键") - handleDoubleClick() - } - KeyEvent.KEYCODE_MEDIA_PAUSE -> { - FileLogger.d(TAG, "处理MEDIA_PAUSE按键") + KeyEvent.KEYCODE_MEDIA_PLAY, + KeyEvent.KEYCODE_MEDIA_PAUSE, + KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE -> { + FileLogger.d(TAG, "处理标准媒体按键: ${keyEvent.keyCode}") handleDoubleClick() } KeyEvent.KEYCODE_HEADSETHOOK -> { @@ -712,16 +733,12 @@ class VoiceInteractionService : Service() { } lastKeyEventTime = currentTime } - KeyEvent.KEYCODE_MEDIA_PLAY_PAUSE -> { - FileLogger.d(TAG, "处理MEDIA_PLAY_PAUSE按键") - handleDoubleClick() - } else -> { - FileLogger.d(TAG, "处理其他按键: ${keyEvent.keyCode}") + FileLogger.d(TAG, "忽略不相关的按键: ${keyEvent.keyCode}") } } } else { - FileLogger.d(TAG, "非ACTION_DOWN事件: ${keyEvent.action}") + FileLogger.d(TAG, "忽略非ACTION_DOWN事件: ${keyEvent.action}") } } diff --git a/lib/data/services/classic_bluetooth_service.dart b/lib/data/services/classic_bluetooth_service.dart index 634bbfb12..bc4c3a25e 100644 --- a/lib/data/services/classic_bluetooth_service.dart +++ b/lib/data/services/classic_bluetooth_service.dart @@ -421,7 +421,7 @@ class ClassicBluetoothService extends GetxService { /// 打开蓝牙设置 Future openBluetoothSettings() async { try { - await AppSettings.openAppSettings(); + await AppSettings.openAppSettings(type: AppSettingsType.bluetooth); return true; } catch (e) { Logger.error('打开蓝牙设置失败: $e');