Tworzenie pierwszego działania na potrzeby okularów AI

Odpowiednie urządzenia XR
Te wskazówki pomogą Ci tworzyć aplikacje na te typy urządzeń XR.
Okulary AI

Funkcje okularów z AI są oparte na istniejącym Activityframeworku API Androida i obejmują dodatkowe koncepcje, które uwzględniają unikalne aspekty okularów z AI. W przeciwieństwie do gogli XR, które uruchamiają na urządzeniu pełny plik APK, okulary z AI korzystają z dedykowanej aktywności uruchamianej w ramach istniejącej aplikacji na telefonie. Ta aktywność jest wyświetlana z urządzenia hosta na okularach z AI.

Aby utworzyć funkcję okularów z AI w aplikacji, rozszerz istniejącą aplikację na telefon, tworząc nowy projekt Activity dla okularów z AI. To działanie jest głównym punktem wejścia do aplikacji na okularach z AI. To podejście upraszcza proces programowania, ponieważ możesz udostępniać i ponownie wykorzystywać logikę biznesową w aplikacjach na telefon i okulary z AI.

Zgodność wersji

Sprawdź wymagania dotyczące zgodności pakietu Android SDK w przypadku pakietu Jetpack XR SDK.

Zależności

Dodaj te zależności bibliotek dotyczące okularów z AI:

Groovy

dependencies {
    implementation "androidx.xr.runtime:runtime:1.0.0-alpha11"
    implementation "androidx.xr.glimmer:glimmer:1.0.0-alpha08"
    implementation "androidx.xr.projected:projected:1.0.0-alpha05"
    implementation "androidx.xr.arcore:arcore:1.0.0-alpha11"
}

Kotlin

dependencies {
    implementation("androidx.xr.runtime:runtime:1.0.0-alpha11")
    implementation("androidx.xr.glimmer:glimmer:1.0.0-alpha08")
    implementation("androidx.xr.projected:projected:1.0.0-alpha05")
    implementation("androidx.xr.arcore:arcore:1.0.0-alpha11")
}

Zadeklaruj aktywność w pliku manifestu aplikacji

Podobnie jak w przypadku innych typów aktywności musisz zadeklarować aktywność w pliku manifestu aplikacji, aby system mógł ją zobaczyć i uruchomić.

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

Najważniejsze informacje o kodzie

  • Określa xr_projected dla atrybutu android:requiredDisplayCategory, aby poinformować system, że ta aktywność powinna używać prognozowanego kontekstu do uzyskiwania dostępu do sprzętu z połączonego urządzenia.

Tworzenie aktywności

Następnie utworzysz małą aktywność, która będzie wyświetlać coś na okularach z AI, gdy tylko wyświetlacz będzie włączony.

@OptIn(ExperimentalProjectedApi::class)
class GlassesMainActivity : ComponentActivity() {

    private var displayController: ProjectedDisplayController? = null
    private var isVisualUiSupported by mutableStateOf(false)
    private var areVisualsOn by mutableStateOf(true)
    private var isPermissionDenied by mutableStateOf(false)

    // Register the permissions launcher using the ProjectedPermissionsResultContract.
    private val requestPermissionLauncher: ActivityResultLauncher<List<ProjectedPermissionsRequestParams>> =
        registerForActivityResult(ProjectedPermissionsResultContract()) { results ->
            if (results[Manifest.permission.CAMERA] == true) {
                isPermissionDenied = false
                initializeGlassesFeatures()
            } else {
                // Handle permission denial.
                isPermissionDenied = true
            }
        }

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        lifecycle.addObserver(object : DefaultLifecycleObserver {
            override fun onDestroy(owner: LifecycleOwner) {
                displayController?.close()
                displayController = null
            }
        })

        if (hasCameraPermission()) {
            initializeGlassesFeatures()
        } else {
            requestHardwarePermissions()
        }

        setContent {
            GlimmerTheme {
                HomeScreen(
                    areVisualsOn = areVisualsOn,
                    isVisualUiSupported = isVisualUiSupported,
                    isPermissionDenied = isPermissionDenied,
                    onRetryPermission = { requestHardwarePermissions() },
                    onClose = { finish() }
                )
            }
        }
    }

    private fun initializeGlassesFeatures() {
        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)
        }
    }

    private fun hasCameraPermission(): Boolean {
        return ContextCompat.checkSelfPermission(this, Manifest.permission.CAMERA) ==
                PackageManager.PERMISSION_GRANTED
    }

    private fun requestHardwarePermissions() {
        val params = ProjectedPermissionsRequestParams(
            permissions = listOf(Manifest.permission.CAMERA),
            rationale = "Camera access is required to overlay digital content on your physical environment."
        )
        requestPermissionLauncher.launch(listOf(params))
    }
}

Najważniejsze informacje o kodzie

Implementowanie funkcji typu „composable”

Utworzone działanie odwołuje się do funkcji HomeScreen typu „composable”, którą musisz wdrożyć. Poniższy kod używa Jetpack Compose Glimmer do zdefiniowania funkcji kompozycyjnej, która może wyświetlać tekst na wyświetlaczu okularów z AI:

@Composable
fun HomeScreen(
    areVisualsOn: Boolean,
    isVisualUiSupported: Boolean,
    isPermissionDenied: Boolean,
    onRetryPermission: () -> Unit,
    onClose: () -> Unit,
    modifier: Modifier = Modifier
) {
    Box(
        modifier = modifier
            .surface(focusable = false)
            .fillMaxSize(),
        contentAlignment = Alignment.Center
    ) {
        if (isPermissionDenied) {
            Card(
                title = { Text("Permission Required") },
                action = { Button(onClick = onClose) { Text("Exit") } }
            ) {
                Text("Camera access is needed to use AI glasses features.")
                Button(onClick = onRetryPermission) { Text("Retry") }
            }
        } else 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")
        }
    }
}

Najważniejsze informacje o kodzie

  • Zgodnie z definicją podaną wcześniej w aktywności funkcja HomeScreen obejmuje treści kompozycyjne, które użytkownik widzi, gdy wyświetlacz okularów z AI jest włączony.
  • Komponent Jetpack Compose Glimmer Text wyświetla na ekranie okularów tekst „Hello, AI Glasses!”.
  • Glimmer Jetpack Compose Button zamyka aktywność, wywołując finish() przez onClose w aktywności okularów z AI.

Sprawdzanie, czy okulary z AI są połączone

Aby przed uruchomieniem aktywności sprawdzić, czy okulary z AI użytkownika są połączone z telefonem, użyj metody ProjectedContext.isProjectedDeviceConnected. Ta metoda zwraca Flow<Boolean>, które aplikacja może obserwować, aby otrzymywać aktualizacje stanu połączenia w czasie rzeczywistym.

Rozpocznij aktywność

Po utworzeniu podstawowej aktywności możesz ją uruchomić na okularach. Aby uzyskać dostęp do sprzętu okularów, aplikacja musi uruchomić aktywność z określonymi opcjami, które informują system o użyciu prognozowanego kontekstu, jak pokazano w tym kodzie:

val options = ProjectedContext.createProjectedActivityOptions(context)
val intent = Intent(context, GlassesMainActivity::class.java)
context.startActivity(intent, options.toBundle())

Metoda createProjectedActivityOptionsProjectedContext generuje opcje niezbędne do rozpoczęcia aktywności w przewidywanym kontekście. Parametr context może być kontekstem z telefonu lub okularów.

Dalsze kroki

Po utworzeniu pierwszej aktywności na okulary z AI możesz poznać inne sposoby rozszerzania ich funkcjonalności: