איך יוצרים מדריך סיורים במציאות משולבת באמצעות Android XR, Geospatial API ו-Gemini
משך הקריאה: 6 דקות
בכנס Google I/O השנה, הכרזנו על עדכון לחוויות מרחביות: Geospatial API זמין עכשיו בגרסת טרום-השקה (Preview) ב-ARCore ל-Jetpack XR. מערכת המיקום החזותי (VPS) של Google ב-Android XR מאפשרת לעגן תוכן דיגיטלי בעולם הפיזי בדיוק של פחות ממטר ובכיוון מדויק באזורים נתמכים.* כדי לבדוק מה אפשר לעשות עם Geospatial API, הצוות שלנו בנה הדגמה: XR Geospatial Tour.
דמיינו שאתם מגיעים לעיר חדשה, מרכיבים משקפי XR עם חיבור חוטי (כמו XREAL Project Aura שיושקו בקרוב), ומיד מקבלים מדריך מקומי שמכיר את האזור ויכול להראות לכם את המקום. לא צריך לבהות במפה דו-ממדית – במקום זאת, מודלים תלת-ממדיים מנחים אתכם בעדינות לאורך המסלול, וקול חכם מספר לכם על ציוני הדרך ההיסטוריים שנמצאים ממש מולכם. שילבנו את ממשקי ה-API הגיאו-מרחביים, Gemini API באמצעות Firebase AI Logic, עיגון במפות Google ו-Jetpack XR SDK כדי ליצור חוויית סיור רגלי סוחפת ללא שימוש בידיים.
כתב ויתור: הסרטון והאפליקציה Tour Guide הם למטרות הדגמה בלבד. חלק מהקטעים קוצרו. יכול להיות שחלק מהחומרה שמוצגת נמצאת בפיתוח, ופרטי המוצר הסופי עשויים להיות שונים.
בואו נסקור את פרטי ההטמעה ונראה איך קישרנו את ממשקי ה-API האלה כדי ליצור חוויה מרחבית בקנה מידה עולמי.
1. איתור המיקום המדויק של המשתמש באמצעות ARCore Geospatial API (VPS)
כדי לשפר את חוויית הניווט ב-XR, אתם יכולים לשלב את היכולות של GPS עם הדיוק של VPS. הדיוק והכיוון המדויק של VPS מאפשרים לנקודות הדרך בתלת-ממד להתאים לעולם הפיזי.
לכן, Geospatial API ב-Android XR יכול לעזור לכם ליצור חוויות בהתאמה אישית. באמצעות ראייה ממוחשבת מתקדמת, מערכת VPS מנסה לספק GeospatialPose (כולל קו רוחב, קו אורך וכיוון) מדויק יותר מ-GPS.
כך אנחנו מאחזרים את התנוחה הגיאוגרפית של המשתמש על ידי מיפוי כיוון המכשיר לקואורדינטה גיאוגרפית:
// 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}") }
כל חוויית המשתמש תלויה ברמת הדיוק הזו, ולכן אנחנו עוקבים אחרי horizontalAccuracy ו-orientationYawAccuracy עד שהם עומדים בדרישות הסף שלנו. אם המשתמש נמצא בתוך מבנה או באזור לא מזוהה, אנחנו מבקשים ממנו "ללכת למרחב ציבורי פתוח ולהסתכל מסביב".
2. יצירת מסלול נסיעה באמצעות Gemini API ועיגון במפות Google
אחרי שנקבל את המיקום, נשתמש ב-Gemini API באמצעות Firebase AI Logic כדי להנחות את מודל Gemini לפעול כמדריך טיולים מקומי. אנחנו מעבירים את הקואורדינטות של המשתמש למודל ומבקשים ממנו להפיק תגובת JSON מובנית שמכילה סיורים רגליים בקרבת מקום:
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.")
מודלים גדולים של שפה (LLM) מעולים ביצירת תיאורים עשירים, אבל לפעמים הם יכולים להזות קואורדינטות מדויקות של קו רוחב/אורך. כדי לפתור את הבעיה, השתמשנו בעיגון במפות Google כדי לעגן את ה-AI.
3. הקול שמנחה אתכם: Gemini 2.5 TTS
כדי שהמדריך ירגיש נוכח באמת, הטמענו קריינות דינמית.
בעזרת gemini-2.5-flash-tts model, אנחנו יכולים להגדיר את המודל כך שיחזיר נתוני אודיו באופן טבעי במקום רק טקסט. כך מבקשים את ResponseModality.AUDIO:
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. הופכים את הרעיון למציאות בתלת-ממד באמצעות Jetpack XR
החלק האחרון בפאזל הוא רינדור הנתונים האלה בשדה הראייה של המשתמש. ערכת ה-SDK של Jetpack XR מאפשרת לעבור בקלות מממשק משתמש דו-ממדי ב-Android למחשוב מרחבי.
השתמשנו ב-Jetpack Compose ל-XR כדי ליצור רכיבים מרחביים. כדי לייצג נקודות עניין לאורך הסיור, בנינו Composable שנקרא InfoSphere, שמכיל GltfModel של כדור תלת-ממדי שמרחף בחלל ואפשר לקיים איתו אינטראקציה כדי לחשוף מידע.
באמצעות Jetpack XR SDK, אנחנו יכולים להציב מודלים תלת-ממדיים לצד ממשק המשתמש של פיתוח נייטיב באמצעות SpatialBox ו-SceneCoreEntity. השתמשנו גם ב-InteractableComponent כדי להגיב ללחיצות של משתמשים.
כשמשלבים את AnimatedSpatialVisibility לממשקי משתמש רגילים ב-Compose עם רכיבי תלת-ממד של SceneCoreEntity, אפשר לשלב נתונים בצורה חלקה בעולם הפיזי.
@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() } }) } } ) } }
מה אפשר לעשות עם Android XR כבר היום
פיתוח האפליקציה XR Geospatial Tour הראה לנו שמפתחי Android יכולים ליצור חוויות מרחביות בקנה מידה עולמי בקלות רבה יותר מאי פעם. גרסת טרום-השקה (Preview) של Geospatial API זמינה עכשיו ב-Android XR, והאפליקציות שלכם יכולות להבין בצורה חלקה את העולם הפיזי שסביבן. כשמשלבים את ממשקי ה-API של Compose for XR עם נתוני המיקום המדויקים של VPS והיכולות הגנרטיביות של Gemini, אפשר ליצור חוויות שמאפשרות להבין גם איפה המשתמש נמצא וגם במה הוא מסתכל.
כדי לעזור לכם להתנסות ב-Android XR, אנחנו שמחים לפתוח את ההרשמה לתוכנית Android XR Developer Catalyst Program, שכוללת את XREAL Project Aura. החל מהיום, אתם יכולים להגיש בקשה לקבלת גישה לערכת פיתוח של XREAL Project Aura או לערכת פיתוח של משקפיים עם תצוגה פנימית בחודשים הקרובים.
*כתב ויתור: זמין במכשירים נבחרים. נדרש חיבור לאינטרנט. התכונה פועלת באפליקציות ובפלטפורמות תואמות. התוצאות עשויות להיות שונות.
-
חדשות על המוצרהיום, במפגש של מפתחי Android, אנחנו מכריזים על הזמינות הרחבה של הרבה כלים וממשקי API שנועדו להסיר את החיכוך היומיומי ולתת לכם יותר גמישות ליצור אפליקציות Android נהדרות.
Matthew McCullough • משך הקריאה: 4 דקות -
חדשות על המוצרגרסת Android Studio Rabbit 2 יציבה ומוכנה לשימוש בסביבת הייצור. הגרסה הזו כוללת תכונות חשובות שמשפרות את הפיתוח, כמו Bring Your Own Agent, תכונות חדשות של אמולטור XR, עדכון של LeakCanary, כלי חדש לניהול מיומנויות של סוכנים, סקר קוד באמצעות AI ועוד.
Matthew Warner • משך הקריאה: 3 דקות -
חדשות על המוצראפליקציות שמטרגטות את הגרסה הבאה של Android לא יוכלו יותר לכתוב ישירות לאנשי קשר באמצעות ההרשאה WRITE_CONTACTS.
Roxanna Aliabadi Walker • משך הקריאה: 6 דקות
רוצים לקבל טיפים עדכניים לפיתוח Android ישירות לאימייל כל שבוע?