Создайте свою первую активность для очков ИИ

Применимые устройства XR
Данное руководство поможет вам создавать приложения для устройств XR такого типа.
Очки с искусственным интеллектом

Интерфейс очков с искусственным интеллектом основан на существующем 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() }
                )
            }
        }
    }
}

Основные моменты, касающиеся кода.

Реализуйте составной модуль.

Созданное вами действие ссылается на составную функцию 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 может представлять собой контекст телефона или очков.

Следующие шаги

Теперь, когда вы создали свою первую активность для очков с искусственным интеллектом, изучите другие способы расширения их функциональности: