Очки с ИИ построены на основе существующего API Android Activity Framework и включают дополнительные концепции для поддержки уникальных функций очков с ИИ. В отличие от гарнитур XR, которые запускают полноценный APK-файл на устройстве, очки с ИИ используют специальную активность, которая запускается в существующем приложении вашего телефона. Эта активность проецируется с хост-устройства на очки с ИИ.
Чтобы реализовать взаимодействие вашего приложения с очками ИИ, вы расширяете существующее приложение для телефона, создавая новое проецируемое Activity для очков ИИ. Это действие служит основной точкой входа для запуска вашего приложения на очках ИИ. Такой подход упрощает разработку, поскольку позволяет совместно использовать и повторно использовать бизнес-логику между телефоном и очками ИИ.
Объявите свою активность в манифесте вашего приложения
Как и другие типы действий, вам необходимо объявить свое действие в файле манифеста вашего приложения, чтобы система могла его увидеть и запустить.
<application>
<activity
android:name=".AIGlassesActivity"
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, чтобы сообщить системе, что это действие должно использовать спроецированный контекст для доступа к оборудованию с подключенного устройства.
Создайте свою деятельность
Далее вам предстоит создать небольшую активность, которая будет отображать что-либо на очках ИИ при каждом включении дисплея.
/**
* When this activity launches, it stays in the started state.
*/
class AIGlassesActivity : ComponentActivity() {
override fun onCreate(savedInstanceState: Bundle?) {
super.onCreate(savedInstanceState)
val projectedWindowManager = ProjectedWindowManager.create(this)
setContent {
GlassesComposeContent {
GlimmerTheme {
TopBarScaffold(modifier = Modifier.background(color = Color.Black)) {
ProjectedDisplayController.create(activity)
.addPresentationModeChangedListener {
presentationModeFlags ->
// Check whether visuals are on or off
val areVisualsOff = !presentationModeFlags.hasPresentationMode(VISUALS_ON)
}
// Conditional UI based on presentation mode.
if (areVisualsOff) {
// Implementation for the when the display is off.
} else {
DisplayUi()
}
}
}
}
}
}
override fun onStart() {
// Do things to make the user aware that this activity is active (for
// example, play audio frequently), when the display is off.
}
override fun onStop() {
// Stop all the data source access.
}
}
Ключевые моменты кода
-
AIGlassesActivityрасширяетComponentActivity, как и следовало ожидать от мобильной разработки. - Блок
setContentвonCreate()определяет корень дерева составного пользовательского интерфейса для действия. - Инициализирует пользовательский интерфейс во время метода
onCreate()действия (см. проектируемый жизненный цикл действия ). - Настраивает базовый макет
TopBarScaffoldс черным фоном для пользовательского интерфейса с помощью Jetpack Compose Glimmer .
Реализовать компонуемый
Созданная вами активность ссылается на компонуемую функцию DisplayUi , которую необходимо реализовать. Следующий код использует Jetpack Compose Glimmer для определения компонуемого объекта, который может отображать текст на дисплее очков ИИ:
@Composable
fun DisplayUi() {
Box(
modifier = Modifier
.fillMaxSize(),
contentAlignment = Alignment.Center
) {
Text("Hello World!")
}
}
Ключевые моменты кода
- Как вы определили ранее в своей деятельности, функция
DisplayUiвключает в себя компонуемый контент, который пользователь видит, когда включен дисплей очков ИИ. - Компонент Jetpack Compose Glimmer
Textотображает текст «Hello World!» на дисплее очков.
Начните свою деятельность
Теперь, когда вы создали базовую активность, вы можете запустить её на очках. Чтобы получить доступ к аппаратному обеспечению очков, ваше приложение должно запустить активность с определёнными параметрами, которые сообщают системе использовать проецируемый контекст , как показано в следующем коде:
val options = ProjectedContext.createProjectedActivityOptions(context)
val intent = Intent(context, AIGlassesActivity::class.java)
context.startActivity(intent, options.toBundle())
Метод createProjectedActivityOptions() в ProjectedContext генерирует необходимые параметры для запуска вашей активности в спроецированном контексте. Параметр context может представлять собой контекст телефона или очков.
Проверьте, подключены ли очки ИИ
Если вы хотите определить, подключены ли очки ИИ пользователя к его телефону до запуска вашей активности, используйте метод ProjectedContext.isProjectedDeviceConnected() . Этот метод возвращает Flow<Boolean> , который ваше приложение может отслеживать, чтобы получать обновления состояния подключения в режиме реального времени.
Следующие шаги
Теперь, когда вы создали свою первую активность для очков ИИ, изучите другие способы расширения их функциональности:
- Обработка аудиовывода с помощью преобразования текста в речь
- Обработка аудиовхода с помощью автоматического распознавания речи
- Создание пользовательского интерфейса с помощью Jetpack Compose Glimmer
- Доступ к аппаратному обеспечению очков ИИ