AI 안경용 첫 번째 활동 만들기

해당 XR 기기
이 안내는 이러한 유형의 XR 기기용 환경을 구축하는 데 도움이 됩니다.
AI 글래스

AI 안경 환경은 기존 Android Activity 프레임워크 API를 기반으로 빌드되며 AI 안경의 고유한 측면을 지원하기 위한 추가 개념이 포함되어 있습니다. 기기에서 전체 APK를 실행하는 XR 헤드셋과 달리 AI 안경은 휴대전화의 기존 앱 내에서 실행되는 전용 활동을 사용합니다. 이 활동은 호스트 기기에서 AI 안경으로 투영됩니다.

앱의 AI 안경 환경을 만들려면 AI 안경용 새 투영 Activity를 만들어 기존 휴대전화 앱을 확장합니다. 이 활동은 AI 안경에서 앱의 기본 실행 진입점 역할을 합니다. 이 접근 방식은 휴대전화 환경과 AI 안경 환경 간에 비즈니스 로직을 공유하고 재사용할 수 있으므로 개발을 간소화합니다.

앱의 매니페스트에서 활동 선언

다른 유형의 활동과 마찬가지로 앱의 매니페스트 파일에 활동을 선언하여 시스템에서 이를 확인하고 실행하도록 해야 합니다.

<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>

코드에 관한 핵심 사항

  • android:requiredDisplayCategory 속성에 xr_projected를 지정하여 이 활동이 연결된 기기의 하드웨어에 액세스할 때 예측된 컨텍스트를 사용해야 한다고 시스템에 알립니다.

활동 만들기

다음으로 디스플레이가 켜질 때마다 AI 안경에 무언가를 표시할 수 있는 작은 활동을 만듭니다.

/**
 *   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를 확장합니다.
  • onCreate() 내의 setContent 블록은 활동의 컴포저블 UI 트리의 루트를 정의합니다.
  • 활동의 onCreate() 메서드 중에 UI를 초기화합니다 (투영된 활동 수명 주기 참고).
  • Jetpack Compose Glimmer를 사용하여 UI의 검은색 배경으로 TopBarScaffold 기본 레이아웃을 설정합니다.

컴포저블 구현

만든 활동은 구현해야 하는 DisplayUi 컴포저블 함수를 참조합니다. 다음 코드는 Jetpack Compose Glimmer를 사용하여 AI 안경의 디스플레이에 일부 텍스트를 표시할 수 있는 컴포저블을 정의합니다.

@Composable
fun DisplayUi() {
    Box(
        modifier = Modifier
            .fillMaxSize(),
        contentAlignment = Alignment.Center
    ) {
        Text("Hello World!")
    }
}

코드에 관한 핵심 사항

  • 앞서 활동에서 정의한 대로 DisplayUi 함수에는 AI 안경의 디스플레이가 켜져 있을 때 사용자에게 표시되는 컴포저블 콘텐츠가 포함됩니다.
  • Jetpack Compose Glimmer Text 구성요소는 'Hello World!'라는 텍스트를 글라스의 디스플레이에 표시합니다.

활동 시작

이제 기본 활동을 만들었으므로 안경에서 실행할 수 있습니다. 안경의 하드웨어에 액세스하려면 앱이 시스템에 예측된 컨텍스트를 사용하도록 지시하는 특정 옵션으로 활동을 시작해야 합니다. 다음 코드를 참고하세요.

val options = ProjectedContext.createProjectedActivityOptions(context)

val intent = Intent(context, AIGlassesActivity::class.java)

context.startActivity(intent, options.toBundle())

ProjectedContextcreateProjectedActivityOptions() 메서드는 예측된 컨텍스트에서 활동을 시작하는 데 필요한 옵션을 생성합니다. context 매개변수는 휴대전화 또는 안경 기기의 컨텍스트일 수 있습니다.

AI 안경이 연결되어 있는지 확인

활동을 실행하기 전에 사용자의 AI 안경이 휴대전화에 연결되어 있는지 확인하려면 ProjectedContext.isProjectedDeviceConnected() 메서드를 사용하세요. 이 메서드는 앱이 연결 상태에 관한 실시간 업데이트를 가져오기 위해 관찰할 수 있는 Flow<Boolean>을 반환합니다.

다음 단계

이제 AI 안경용 첫 번째 활동을 만들었으니 기능을 확장할 수 있는 다른 방법을 살펴보세요.