|
|
|
@ -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}") |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|