Интерфейс очков с искусственным интеллектом основан на существующем API фреймворка Android Activity и включает в себя дополнительные концепции для поддержки уникальных особенностей таких очков. В отличие от XR-гарнитур, которые запускают полноценный APK-файл на устройстве, очки с искусственным интеллектом используют специальную активность, которая работает внутри существующего приложения вашего телефона. Эта активность проецируется с устройства-носителя на очки с искусственным интеллектом.
Для создания интерфейса вашего приложения для использования с очками с ИИ, вы расширяете существующее мобильное приложение, создавая новую проецируемую Activity для очков с ИИ. Эта активность служит основной точкой входа для запуска вашего приложения в очках с ИИ. Такой подход упрощает разработку, поскольку вы можете совместно использовать и повторно применять бизнес-логику как в мобильном приложении, так и в очках с ИИ.
Совместимость версий
Проверьте требования к совместимости Android SDK для Jetpack XR SDK.
Зависимости
Добавьте следующие зависимости библиотек для очков с искусственным интеллектом :
Классный
dependencies { implementation "androidx.xr.runtime:runtime:1.0.0-alpha10" implementation "androidx.xr.glimmer:glimmer:1.0.0-alpha06" implementation "androidx.xr.projected:projected:1.0.0-alpha04" implementation "androidx.xr.arcore:arcore:1.0.0-alpha10" }
Котлин
dependencies { implementation("androidx.xr.runtime:runtime:1.0.0-alpha10") implementation("androidx.xr.glimmer:glimmer:1.0.0-alpha06") implementation("androidx.xr.projected:projected:1.0.0-alpha04") implementation("androidx.xr.arcore:arcore:1.0.0-alpha10") }
Укажите тип активности в манифесте вашего приложения.
Как и в случае с другими типами действий, вам необходимо объявить о своем действии в файле манифеста вашего приложения, чтобы система могла его увидеть и запустить.
<application>
<activity
android:name="com.example.xr.projected.GlassesMainActivity"
android:exported="true"
android:requiredDisplayCategory="xr_projected"
android:label="Example AI Glasses activity">
<intent-filter>
<action android:name="android.intent.action.MAIN" />
</intent-filter>
</activity>
</application>
Основные моменты, касающиеся кода.
- Указывает
xr_projectedдля атрибутаandroid:requiredDisplayCategory, чтобы сообщить системе, что это действие должно использовать проецируемый контекст для доступа к оборудованию подключенного устройства.
Создайте свою активность
Далее вам нужно будет создать небольшое приложение, которое будет отображать что-либо на очках с искусственным интеллектом всякий раз, когда дисплей включен.
@OptIn(ExperimentalProjectedApi::class) class GlassesMainActivity : ComponentActivity() { private var displayController: ProjectedDisplayController? = null private var isVisualUiSupported by mutableStateOf(false) private var areVisualsOn by mutableStateOf(true) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) lifecycle.addObserver(object : DefaultLifecycleObserver { override fun onDestroy(owner: LifecycleOwner) { displayController?.close() displayController = null } }) lifecycleScope.launch { // Check device capabilities val projectedDeviceController = ProjectedDeviceController.create(this@GlassesMainActivity) isVisualUiSupported = projectedDeviceController.capabilities.contains(CAPABILITY_VISUAL_UI) val controller = ProjectedDisplayController.create(this@GlassesMainActivity) displayController = controller val observer = GlassesLifecycleObserver( context = this@GlassesMainActivity, controller = controller, onVisualsChanged = { visualsOn -> areVisualsOn = visualsOn } ) lifecycle.addObserver(observer) } setContent { GlimmerTheme { HomeScreen( areVisualsOn = areVisualsOn, isVisualUiSupported = isVisualUiSupported, onClose = { finish() } ) } } } }
Основные моменты, касающиеся кода.
- Выбирает использование экспериментальных API из библиотеки Jetpack Projected .
-
GlassesMainActivityнаследуетComponentActivity, как и следовало ожидать в мобильной разработке. - Поскольку не все очки с искусственным интеллектом имеют дисплей, проверка наличия дисплея на устройстве выполняется с помощью
ProjectedDeviceController. - Блок
setContentвнутри функцииonCreateопределяет корень дерева Composable UI для активности. Вы реализуете ComposableHomeScreenс помощью Jetpack Compose Glimmer . - Инициализирует пользовательский интерфейс во время вызова метода
onCreateактивности (см. прогнозируемый жизненный цикл активности ).
Реализуйте составной модуль.
Созданное вами действие ссылается на составную функцию HomeScreen , которую вам необходимо реализовать. Следующий код использует Jetpack Compose Glimmer для определения составного элемента, который может отображать текст на экране очков с искусственным интеллектом:
@Composable fun HomeScreen( areVisualsOn: Boolean, isVisualUiSupported: Boolean, onClose: () -> Unit, modifier: Modifier = Modifier ) { Box( modifier = modifier .surface(focusable = false) .fillMaxSize(), contentAlignment = Alignment.Center ) { if (isVisualUiSupported) { Card( title = { Text("Android XR") }, action = { Button(onClick = onClose) { Text("Close") } } ) { if (areVisualsOn) { Text("Hello, AI Glasses!") } else { Text("Display is off. Audio guidance active.") } } } else { Text("Audio Guidance Mode Active") } } }
Основные моменты, касающиеся кода.
- Как вы уже указали в своем предыдущем сообщении, функция
HomeScreenвключает в себя составной контент, который пользователь видит, когда дисплей очков с искусственным интеллектом включен. - Компонент Jetpack Compose Glimmer
Textотображает текст "Привет, очки с искусственным интеллектом!" на экране очков. - Кнопка Jetpack Compose Glimmer
Buttonзакрывает активность, вызываяfinish()черезonCloseв активности AI Glasses.
Проверьте, подключены ли очки с искусственным интеллектом.
Чтобы определить, подключены ли очки пользователя с искусственным интеллектом к его телефону перед запуском вашего приложения, используйте метод ProjectedContext.isProjectedDeviceConnected . Этот метод возвращает Flow<Boolean> , который ваше приложение может отслеживать для получения обновлений о состоянии подключения в реальном времени.
Начать свою активность
Теперь, когда вы создали базовую активность, вы можете запустить её на своих очках. Для доступа к аппаратному обеспечению очков ваше приложение должно запустить активность с определёнными параметрами, которые указывают системе использовать проецируемый контекст , как показано в следующем коде:
val options = ProjectedContext.createProjectedActivityOptions(context) val intent = Intent(context, GlassesMainActivity::class.java) context.startActivity(intent, options.toBundle())
Метод createProjectedActivityOptions в ProjectedContext генерирует необходимые параметры для запуска активности в проецируемом контексте. Параметр context может представлять собой контекст телефона или очков.
Следующие шаги
Теперь, когда вы создали свою первую активность для очков с искусственным интеллектом, изучите другие способы расширения их функциональности:
- Обработка аудиовывода с помощью преобразования текста в речь.
- Обработка аудиовхода с помощью автоматического распознавания речи.
- Создавайте пользовательский интерфейс с помощью Jetpack Compose и Glimmer.
- Получите доступ к аппаратному обеспечению очков с искусственным интеллектом.