From 22ff4384ca9bdaef37e692d5cbca48703580ef77 Mon Sep 17 00:00:00 2001 From: yangxisong Date: Mon, 10 Nov 2025 17:20:15 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=88=9D=E5=A7=8B=E5=8C=96=20SDK?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- app/libs/sprite_dcg_sdk-2ca23e9-release.aar | Bin 0 -> 30050 bytes app/src/main/AndroidManifest.xml | 2 +- .../java/com/yuanxuan/rokid/MainActivity.kt | 9 + .../com/yuanxuan/rokid/RokidApplication.kt | 36 +++ .../yuanxuan/rokid/app/RokidApplication.kt | 11 - .../rokid/dependencies/AppDependencies.kt | 31 +++ .../ApplicationDependencyProvider.kt | 10 + .../rokid/device/DeviceServiceManager.kt | 260 ++++++++++++++++++ .../rokid/keeplive/KeepLiveService.kt | 2 +- 9 files changed, 348 insertions(+), 13 deletions(-) create mode 100644 app/libs/sprite_dcg_sdk-2ca23e9-release.aar create mode 100644 app/src/main/java/com/yuanxuan/rokid/RokidApplication.kt delete mode 100644 app/src/main/java/com/yuanxuan/rokid/app/RokidApplication.kt create mode 100644 app/src/main/java/com/yuanxuan/rokid/dependencies/AppDependencies.kt create mode 100644 app/src/main/java/com/yuanxuan/rokid/dependencies/ApplicationDependencyProvider.kt create mode 100644 app/src/main/java/com/yuanxuan/rokid/device/DeviceServiceManager.kt diff --git a/app/libs/sprite_dcg_sdk-2ca23e9-release.aar b/app/libs/sprite_dcg_sdk-2ca23e9-release.aar new file mode 100644 index 0000000000000000000000000000000000000000..0f410fa12e90b759399481b9f95982ecb5ebe552 GIT binary patch literal 30050 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 literal 0 HcmV?d00001 diff --git a/app/src/main/AndroidManifest.xml b/app/src/main/AndroidManifest.xml index f9cf2a1..c0f5076 100644 --- a/app/src/main/AndroidManifest.xml +++ b/app/src/main/AndroidManifest.xml @@ -3,7 +3,7 @@ xmlns:tools="http://schemas.android.com/tools"> (InstructState.None) + val instructState = _instructState.asStateFlow() + + lateinit var sn: String + private set + + val coroutineExceptionHandler = CoroutineExceptionHandler { _, exception -> + Timber.e(exception, "全局捕获协程异常:${exception.message}") + } + private val scope = + CoroutineScope(SupervisorJob() + Dispatchers.Main + coroutineExceptionHandler) + private var wakeTimeoutJob: Job? = null + + init { + val filter = IntentFilter() + filter.addAction(SysKeyAction.SPRITE_BUTTON_DOWN) + filter.addAction(SysKeyAction.SPRITE_BUTTON_UP) + filter.addAction(SysKeyAction.SPRITE_BUTTON_CLICK) + filter.addAction(SysKeyAction.SPRITE_BUTTON_LONG_PRESS) + filter.addAction(SysKeyAction.SPRITE_BUTTON_VERY_VERY_LONG_PRESS) + filter.addAction(SysKeyAction.TOUCH_BAR_LONG_PRESS) + context.registerReceiver(SysKeyReceiver(), filter) + + scope.launch { + instructState.collect { + Timber.d("语音指令状态 $it") + when (it) { + InstructState.None -> instructService?.unregisterListener(instructListener) + InstructState.WaitingInstructState -> { + instructService?.registerListener(instructListener) + startWakeTimeoutCountdown() + } + } + } + } + } + + val instructListener = object : IInstructListener.Stub() { + override fun onInstructReceived(p0: Int) { + Timber.d("接受到语音指令$p0") + if (p0 != IInstructService.INSTRUCT_QUIT) { + startWakeTimeoutCountdown() + } + when (p0) { + IInstructService.INSTRUCT_WAKEUP -> { + } + + IInstructService.INSTRUCT_VOLUME_UP -> { + systemFuncServiceTodo { service -> + setVolumeSpecified(service.volumeSpecified + 1) + } + } + + IInstructService.INSTRUCT_VOLUME_DOWN -> { + systemFuncServiceTodo { service -> + setVolumeSpecified(service.volumeSpecified - 1) + } + } + + IInstructService.INSTRUCT_LIGHT_UP -> { + systemFuncServiceTodo { service -> + setBrightnessSpecified(service.brightnessSpecified + 1) + } + } + + IInstructService.INSTRUCT_LIGHT_DOWN -> { + systemFuncServiceTodo { service -> + setBrightnessSpecified(service.brightnessSpecified - 1) + } + } + + IInstructService.INSTRUCT_TAKE_PHOTO -> { + + } + + IInstructService.INSTRUCT_START_AUDIO_RECORD -> { + + } + + IInstructService.INSTRUCT_STOP_AUDIO_RECORD -> { + + } + + IInstructService.INSTRUCT_START_VIDEO_RECORD -> { + + } + + IInstructService.INSTRUCT_STOP_VIDEO_RECORD -> { + + } + + IInstructService.INSTRUCT_QUIT -> { + _instructState.update { InstructState.None } + } + } + } + } + + /** + * [INSTRUCT_WAITE_TIME] 一段时间无新指令 退出等待状态 + */ + private fun startWakeTimeoutCountdown() { + wakeTimeoutJob?.cancel() + wakeTimeoutJob = scope.launch { + delay(INSTRUCT_WAITE_TIME) + _instructState.update { InstructState.None } + } + } + + fun playTTS(msg: String) { + ttsServiceTodo { + ttsService?.playTtsMsg(msg) + } + } + + suspend fun getSn() = suspendCancellableCoroutine { continuation -> + systemFuncServiceTodo { service -> + sn = service.sn + continuation.resume(sn) + } + } + + private inline fun ttsServiceTodo(crossinline todo: (ITTSService) -> Unit) { + if (ttsService == null) { + ServiceManager.getTTSService(context) { service -> + if (service == null) { + Timber.d("设备初始化TTS服务失败") + return@getTTSService + } + ttsService = service + todo.invoke(service) + } + } else { + todo.invoke(ttsService!!) + } + } + + private inline fun systemFuncServiceTodo(crossinline todo: (ISystemFuncService) -> Unit) { + if (systemFuncService == null) { + ServiceManager.getSystemFuncService(context) { service -> + if (service == null) { + Timber.d("设备初始化系统功能服务失败") + return@getSystemFuncService + } + systemFuncService = service + todo.invoke(service) + Timber.d(" ${service.sn}") + } + } else { + todo.invoke(systemFuncService!!) + } + } + + private inline fun instructServiceTodo(crossinline todo: (IInstructService) -> Unit) { + if (instructService == null) { + ServiceManager.getInstructService(context) { service -> + if (service == null) { + Timber.d("设备初始化语音指令服务失败") + return@getInstructService + } + instructService = service + todo.invoke(service) + } + } else { + todo.invoke(instructService!!) + } + } + + private fun setVolumeSpecified(volume: Int) { + systemFuncService?.volumeSpecified = volume.coerceIn(0, 15) + } + + private fun setBrightnessSpecified(brightness: Int) { + systemFuncService?.brightnessSpecified = brightness.coerceIn(0, 15) + } + + inner class SysKeyReceiver : BroadcastReceiver() { + override fun onReceive(context: Context?, intent: Intent?) { + val action = intent?.action ?: return + when (action) { + SysKeyAction.SPRITE_BUTTON_DOWN -> { + Timber.d("按下拍照键 SPRITE_BUTTON_DOWN") + } + + SysKeyAction.SPRITE_BUTTON_UP -> { + Timber.d("抬起拍照键 SPRITE_BUTTON_UP") + } + + SysKeyAction.SPRITE_BUTTON_CLICK -> { + Timber.d("点击拍照键 SPRITE_BUTTON_CLICK") + } + + SysKeyAction.SPRITE_BUTTON_LONG_PRESS -> { + Timber.d("长按拍照键 SPRITE_BUTTON_LONG_PRESS") + } + + SysKeyAction.SPRITE_BUTTON_VERY_VERY_LONG_PRESS -> { + Timber.d("超级长的长按拍照键 SPRITE_BUTTON_VERY_VERY_LONG_PRESS") + } + + SysKeyAction.TOUCH_BAR_LONG_PRESS -> { + Timber.d("长按触摸板 TOUCH_BAR_LONG_PRESS") + instructServiceTodo { + _instructState.update { InstructState.WaitingInstructState } + } + } + } + } + } + + sealed interface InstructState { + data object None : InstructState + data object WaitingInstructState : InstructState + } + +} + diff --git a/app/src/main/java/com/yuanxuan/rokid/keeplive/KeepLiveService.kt b/app/src/main/java/com/yuanxuan/rokid/keeplive/KeepLiveService.kt index 1e011ce..8dae168 100644 --- a/app/src/main/java/com/yuanxuan/rokid/keeplive/KeepLiveService.kt +++ b/app/src/main/java/com/yuanxuan/rokid/keeplive/KeepLiveService.kt @@ -20,7 +20,7 @@ class KeepLiveService : Service() { companion object { const val NOTIFICATION_CHANNEL_ID = "KeepLiveServiceChannel" const val NOTIFICATION_CHANNEL_NAME = NOTIFICATION_CHANNEL_ID - const val NOTIFICATION_ID = 101 // 使用一个唯一的ID + const val NOTIFICATION_ID = 101 const val WAKE_LOCK_TAG = "KeepLiveService:WakeLock" }