Работа с камерой
Вы можете настроить в Native App взаимодействие с камерой.
Получение доступа к камере
Для получения изображения с камеры устройства вы можете использовать встроенные механизмы Android. Для этого изучите документацию Android Camera2 API.
При использовании камеры через этот протокол необходимо:
- запрашивать у пользователя разрешение на получение доступа;
- обрабатывать callback с ошибками. Например, на устройстве SberPortal есть крышка, которая закрывает доступ к камере. Если в этот момент смартап попытается использовать камеру устройства, то появится ошибка, которую необходимо правильно обработать.
Распознавание жестов и позы
Чтобы распознавать позы и жесты со встроенных на устройствах камер, добавьте SDK в app/build.gradle:
dependencies {
implementation "ru.sberdevices.smartapp.sdk:cv:1.0"
}
Библиотека распознает:
- жесты (например, пользователь показывает ладонь, и устройство понимает, что это знак «Пауза»);
- лицо и тело, и их размещение в прямоугольной рамке;
- позы (ключевые точки лица и тела);
- фон (для отделения фона от фигуры человека).
Настройка навигационных жестов
Умные устройства с видеокамерой автоматически распознают навигационные жесты пользователя — движения рукой вверх, вниз, вправо и влево соответствуют аналогичным свайпам на экране устройства. Функциональность доступна на устройствах версии StarOS 1.80 и выше.
Чтобы изменить или отключить реакцию смартапа на жесты, переопределите метод dispatchTouchEvent
в Activity смартапа. Теперь если устройство зафиксирует навигационный жест, то поле deviceId
параметра MotionEvent
примет значение 999 (SWIPE_GESTURE_DEVICE_ID).
Чтобы определить тип навигационного жеста, создайте класс GestureDetectorCompat
и передайте в него OnSwipeListener
в качестве обработчика жестов. Параметр direction
будет содержать информацию о типе жеста. Далее вы можете изменить реакцию на жесты навигации в соответствии с логикой смартапа.
Чтобы смартап не реагировал на навигационный жест, обозначьте, что жест обработан. Для этого верните true
в методе dispatchTouchEvent
.
Пример обработки жестов в Activity смартапа:
import ru.sberdevices.utils.OnSwipeListener
import ru.sberdevices.utils.SWIPE_GESTURE_DEVICE_ID
const val IS_GESTURE_NAVIGATION_ENABLED = true
class MainActivity : Activity() {
private val gestureDetector by lazy { // lazy, так как контекст еще не создан
GestureDetectorCompat(this as Context, OnSwipeListener { direction ->
Toast.makeText(this, "$direction", Toast.LENGTH_SHORT).show() // здесь должна быть ваша логика
true // сообщаем системе, что мы обработали событие
})
}
override fun dispatchTouchEvent(ev: MotionEvent): Boolean {
if (ev.deviceId == SWIPE_GESTURE_DEVICE_ID) { // определяем, сгенерировано ли событие
return if (!IS_GESTURE_NAVIGATION_ENABLED) {
true // обработка сгенерированных жестов выключена, сообщаем системе, что событие уже обработано
} else {
gestureDetector.onTouchEvent(ev) // передаем событие в gestureDetector
}
}
return super.dispatchTouchEvent(ev) // событие обычное, можно его не обрабатывать и передать обратно системе
}
}