Produktneuigkeiten

Mixed-Reality-Reiseführer mit Android XR, der Geospatial API und Gemini erstellen

Lesezeit: 6 Minuten

Auf der diesjährigen Google I/O haben wir ein Update für räumliche Erlebnisse angekündigt: Die Geospatial API ist jetzt als Vorabversion in ARCore für Jetpack XR verfügbar. Durch die Integration des Visual Positioning System (VPS) von Google in Android XR können digitale Inhalte in unterstützten Bereichen mit einer Genauigkeit von unter einem Meter und präziser Ausrichtung in der physischen Welt verankert werden.* Um herauszufinden, was mit der Geospatial API möglich ist, hat unser Team eine Demo erstellt: die XR Geospatial Tour.

Stell dir vor, du kommst in eine neue Stadt, setzt eine kabelgebundene XR-Brille auf (wie die kommende XREAL Project Aura) und hast sofort einen ortskundigen Local Guide, der dir die Gegend zeigt. Du musst nicht auf eine 2D-Karte starren, sondern wirst von 3D-Modellen sanft geleitet und eine intelligente Stimme erzählt dir etwas über die historischen Sehenswürdigkeiten, die du gerade siehst. Wir haben die Geospatial APIs, die Gemini API mit Firebase AI Logic, Google Maps Grounding und das Jetpack XR SDK kombiniert, um eine immersive, per Sprachbefehl gesteuerte Stadtführung zu erstellen.

Haftungsausschluss: Das Video und die Tour Guide-Anwendung dienen nur zu Demonstrationszwecken. Einige Sequenzen wurden gekürzt. Die abgebildete Hardware befindet sich möglicherweise noch in der Entwicklung. Die Produktdetails des finalen Produkts können abweichen.

Sehen wir uns die Implementierungsdetails an und wie wir diese APIs miteinander verknüpft haben, um eine globale räumliche Umgebung zu schaffen.

1. Nutzer mit der ARCore Geospatial API (VPS) lokalisieren

Verbessern Sie die Navigation in XR, indem Sie die Leistungsfähigkeit von GPS mit der Präzision von VPS kombinieren. Dank der Genauigkeit und präzisen Ausrichtung des VPS können 3D-Wegpunkte an der physischen Welt ausgerichtet werden.

Mit der Geospatial API für Android XR können Sie benutzerdefinierte Erlebnisse erstellen. Mithilfe von fortschrittlichem Computer Vision versucht das VPS, eine GeospatialPose (einschließlich Längengrad, Breitengrad und Richtung) bereitzustellen, die genauer als GPS ist.

So rufen wir die Geospatial-Pose des Nutzers ab, indem wir die Ausrichtung des Geräts einer Geospatial-Koordinate zuordnen:

// Retrieve the current geospatial pose from the ARCore session
val result = geospatial.createGeospatialPoseFromPose(arDevice.state.value.devicePose)
if (result is CreateGeospatialPoseFromPoseSuccess) {
    val pose = result.pose
    Log.d("VPS", "Accurate Location: ${pose.latitude}, ${pose.longitude}")
}

Da die gesamte Nutzererfahrung von dieser Genauigkeit abhängt, beobachten wir die horizontalAccuracy und orientationYawAccuracy, bis sie unsere Grenzwerte erreichen. Wenn sich der Nutzer in einem Gebäude oder in einem nicht erkannten Bereich befindet, wird er aufgefordert, „zu einem öffentlichen Ort im Freien zu gehen und sich umzusehen“.

2. Reiseplan mit der Gemini API und Fundierung mit Google Maps erstellen

Sobald wir einen Standort haben, verwenden wir die Gemini API mit Firebase AI Logic, um das Gemini-Modell aufzufordern, als lokaler Reiseführer zu fungieren. Wir übergeben die Koordinaten des Nutzers an das Modell und bitten es, eine strukturierte JSON-Antwort mit nahegelegenen Stadtrundgängen auszugeben:

   val configForTools = ToolConfig(
      functionCallingConfig = null,
      retrievalConfig = retrievalConfig {
        latLng = FirebaseLatLng(pose.latitude, pose.longitude)
        languageCode = "en"
      }
    )

    val responseJsonSchema = Schema.obj(
      mapOf(
        "locationIntro" to Schema.string(),
        "tours" to Schema.array(
          Schema.obj(
            mapOf(
              "title" to Schema.string(),
              "description" to Schema.string(),
              "stops" to Schema.array(
                Schema.obj(
                  mapOf(
                    "name" to Schema.string(),
                    "detailedName" to Schema.string(),
                    "description" to Schema.string()
                  )
                )
              )
            )
          )
        )
      )
    )

    val model = Firebase.ai(backend = GenerativeBackend.googleAI()).generativeModel(
      modelName = "gemini-3.5-flash",
      tools = listOf(Tool.googleMaps()),
      generationConfig = generationConfig {
        responseMimeType = "application/json"
        responseSchema = responseJsonSchema
      }
    )

   val result = model.generateContent("The user is at latitude ${pose.latitude} and longitude ${pose.longitude}. Generate exactly 3 diverse tours near this location (e.g., historical, food, nature). All tour ideas should be walking distance only.")

Large Language Models sind hervorragend darin, detaillierte Beschreibungen zu generieren, können aber manchmal genaue Breiten- und Längengradkoordinaten halluzinieren. Um dieses Problem zu lösen, haben wir die KI mit Google Maps Grounding fundiert.

3. Eine Stimme, die Sie führt: Gemini 2.5 TTS

Damit der Reiseführer wirklich präsent wirkt, haben wir dynamische Voiceovers implementiert.

Mit dem gemini-2.5-flash-tts model können wir die Modellgenerierungskonfiguration so einrichten, dass sie nativ Audiodaten anstelle von nur Text zurückgibt. So kannst du die ResponseModality.AUDIO anfordern:

val ttsModel = Firebase.ai(backend = GenerativeBackend.googleAI())
    .generativeModel(
        modelName = "gemini-2.5-flash-tts",
        generationConfig = generationConfig {
            // Instruct the model to return Audio
            responseModalities = listOf(ResponseModality.AUDIO)
        }
    )

val response = ttsModel.generateContent("Say in a neutral but positive voice:\n$prompt")

// Extract the raw audio bytes from the response
val audioBytes = response.candidates.firstOrNull()?.content?.parts
    ?.filterIsInstance<InlineDataPart>()
    ?.firstOrNull { it.mimeType.contains("audio") }?.inlineData

4. 3D-Inhalte mit Jetpack XR zum Leben erwecken

Das letzte Puzzleteil ist die Darstellung dieser Daten im Sichtfeld des Nutzers. Das Jetpack XR SDK ermöglicht einen intuitiven Übergang von einer 2D-Android-UI zu Spatial Computing.

Wir haben Jetpack Compose for XR verwendet, um räumliche Komponenten zu erstellen. Um POIs entlang der Tour darzustellen, haben wir eine Composable namens „InfoSphere“ erstellt. Sie enthält ein GltfModel einer 3D-Kugel, die im Raum schwebt und mit der interagiert werden kann, um Informationen anzuzeigen.

Mit dem Jetpack XR SDK können wir 3D-Modelle mithilfe von SpatialBox und SceneCoreEntity neben der Compose-UI platzieren. Außerdem haben wir InteractableComponent verwendet, um auf das Tippen von Nutzern zu reagieren.

Durch die Kombination von AnimatedSpatialVisibility für herkömmliche Compose-UI-Oberflächen mit SceneCoreEntity-3D-Elementen können wir Daten nahtlos in die physische Welt einfügen.

@Composable
fun InfoSphere(
    content: InfoBubbleContent,
    session: Session,
    sphereModel: GltfModel,
    isSelected: Boolean,
    onClick: () -> Unit
) {
    // SpatialBox lets us arrange 3D components and SpatialPanels together
    SpatialBox(
        SubspaceModifier
            .offset(x = 2.dp, y = 1.dp, z = (-3).dp) // Positioned in 3D space
    ) {
        // Smoothly animate the visibility of our 2D Compose UI Panel
        AnimatedSpatialVisibility(visible = isSelected) {
            SpatialPanel {
                InfoBubble(content) // Regular 2D Compose UI
            }
        }
        // Render our interactive 3D sphere
        SceneCoreEntity(
            factory = {
                GltfModelEntity.create(session, sphereModel).also { entity ->
                    // Make the 3D model respond to user taps
                    entity.addComponent(InteractableComponent.create(session) { inputEvent ->
                        if (inputEvent.action == InputEvent.Action.UP) {
                            onClick()
                        }
                    })
                }
            }
        )
    }
}

Entdecken Sie, was mit Android XR möglich ist

Die Entwicklung der XR Geospatial Tour-App hat uns gezeigt, dass die Einstiegshürde für Android-Entwickler, die weltweite räumliche Erlebnisse schaffen möchten, so niedrig wie nie zuvor ist. Die Geospatial API ist jetzt als Vorabversion für Android XR verfügbar. Damit können Ihre Apps die physische Welt um sie herum nahtlos erfassen. Durch die Kombination der APIs von Compose for XR mit den hochpräzisen Standortdaten des VPS und den generativen Funktionen von Gemini können wir Erlebnisse schaffen, die sowohl den Standort des Nutzers als auch das, was er sich ansieht, berücksichtigen.

Damit Sie Android XR selbst ausprobieren können, freuen wir uns, Bewerbungen für das Android XR Developer Catalyst Program entgegenzunehmen, das auch XREAL Project Aura umfasst. Ab heute können Sie sich für den Zugriff auf ein XREAL Project Aura-Devkit oder unser Display-Brillen-Devkit in den kommenden Monaten bewerben. 

*Rechtliche Hinweise: Verfügbar auf ausgewählten Geräten. Es ist eine Internetverbindung erforderlich. Funktioniert mit kompatiblen Apps und Oberflächen. Die Ergebnisse können variieren. 

Weiterlesen