ym88659208ym87991671
Настраиваем обработку команд | Документация для разработчиков
Skip to main content

Настраиваем обработку команд

Чтобы фронтенд понимал команды, приходящие с бэкенда, вам нужно дополнительно настроить Android-приложение.

Рассмотрим это на примере демонстрационного Native App. Он опубликован в каталоге приложений, чтобы запустить его, скажите ассистенту на умном устройстве Sber: «Открой демо новый зеленый».

Демо

Команды сценария

В демонстрационном Native App на вкладке Assistant пользователь может надевать вещи на андроида и снимать их. Чтобы настроить этот процесс:

  1. Подпишитесь на получение сообщений от сценария с помощью библиотеки Messaging:
init {
messaging.addListener(listener)
}
  1. Добавьте список команд, чтобы пользователи могли надевать и снимать одежду с андроида:
/**
* Base command from smartapp backend
*/
@Serializable
sealed class BaseCommand

/**
* Command for dressing up the Android
*/
@Serializable
@SerialName("wear_this")
internal class WearThisCommand(
val clothes: Clothes? = null
): BaseCommand()

/**
* Command for undressing the Android
*/
@Serializable
@SerialName("dont_wear_anything")
internal class ClearClothesCommand: BaseCommand()
  1. Добавьте список вещей, которые пользователь сможет надевать на андроида:
/**
* Items variants
*/
@Serializable
enum class Clothes(val clothes: String) {
@SerialName("шапку")
BEANIE("шапка"),

@SerialName("перчатки")
GLOVES("перчатки"),

@SerialName("ботинки")
BOOTS("ботинки"),

@SerialName("куртку")
JACKET("куртка")
}
  1. Настройте передачу информации о вещах в графический интерфейс:
private val _clothes = MutableSharedFlow<Clothes?>
  1. Подключите обработчик входящих сообщений:
private val listener = object : Messaging.Listener {
override fun onMessage(messageId: MessageId, payload: Payload) {
logger.debug { "Message ${messageId.value} received: ${payload.data}" }

val model = commandParser.decodeFromString<BaseCommand>(payload.data) // парсим входящие сообщения

when (model) { // обрабатываем входящую команду – надеваем или снимаем вещь
is WearThisCommand -> {
model.clothes?.let {
currentClothes.add(it)
_clothes.tryEmit(model.clothes)
}
}
is ClearClothesCommand -> {
currentClothes.clear()
_clothes.resetReplayCache()
_clothes.tryEmit(null)
}
}

// send current state to smartapp backend
appStateHolder.setState( // определяем текущий appState – что надето на андроиде
Json.encodeToString(
MyAppState("На андроиде ${currentClothes.joinToString(transform = { it.clothes })}")
)
)
}

override fun onError(messageId: MessageId, throwable: Throwable) { // создаем обработчик ошибок
logger.error { throwable.stackTraceToString() }
}
}

В инфраструктуре голосовых сценариев реализованы стандартные команды, например, навигация.

Чтобы смартап понимал навигационные команды пользователя, например, «вверх» и «вниз», создайте обработчик навигационных команд:

override fun onNavigationCommand(payload: Payload) {
val navCommand = commandParser.decodeFromString<NavigationCommand>(payload.data)

when (navCommand.command) {
NavCommand.UP -> navFlow.tryEmit(Gesture.SWIPE_UP)
NavCommand.DOWN -> navFlow.tryEmit(Gesture.SWIPE_DOWN)
NavCommand.LEFT -> navFlow.tryEmit(Gesture.SWIPE_LEFT)
NavCommand.RIGHT -> navFlow.tryEmit(Gesture.SWIPE_RIGHT)
NavCommand.FORWARD -> navFlow.tryEmit(Gesture.SWIPE_RIGHT)
}
}

Заметили ошибку?

Выделите текст и нажмите Ctrl + Enter, чтобы сообщить нам о ней