איך יוצרים מדריך טיולים במציאות משולבת באמצעות Android XR, Geospatial API ו-Gemini
משך הקריאה: 6 דקות
בכנס Google I/O השנה, הודענו על עדכון לחוויות מרחביות: Geospatial API זמין עכשיו כגרסת Preview ב- ARCore for Jetpack XR. פלטפורמת Android XR מאפשרת לעגן תוכן דיגיטלי בעולם הפיזי ברמת דיוק של פחות ממטר אחד ובאוריינטציה מדויקת באזורים נתמכים, באמצעות מערכת מיקום חזותי (VPS) של Google.* כדי להבין מה אפשר לעשות באמצעות Geospatial API, הצוות שלנו יצר הדגמה: סיור גיאוספציאלי ב-XR.
תארו לעצמכם שאתם נכנסים לעיר חדשה, מרכיבים משקפי XR עם חיבור קווי (כמו XREAL Project Aura שעתידים לצאת) ומקבלים מיד מדריך מקומי שמכיר את העיר ומראה לכם את הדרך. לא צריך להסתכל על מפה דו-ממדית – במקום זאת, מודלים תלת-ממדיים מנחים אתכם בעדינות בדרך, וקול חכם מספר לכם על ציוני הדרך ההיסטוריים שנמצאים ממש מולכם. שילבנו את ממשקי ה-API של Geospatial, Gemini API באמצעות Firebase AI Logic, Google Maps Grounding ו- Jetpack XR SDK כדי ליצור חוויה סוחפת של סיור רגלי ללא ידיים.
כתב ויתור: האפליקציות 'סרטון' ו'מדריך סיורים' הן למטרות הדגמה בלבד. חלק מהקטעים קוצרו. כל חומרה שמוצגת עשויה להיות בשלבי פיתוח, והפרטים הסופיים של המוצר עשויים להיות שונים.
במאמר הזה נסביר איך הטמענו את ממשקי ה-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.")
מודלים גדולים של שפה מצוינים ביצירת תיאורים עשירים, אבל לפעמים הם ממציאים קואורדינטות מדויקות של קו רוחב/אורך. כדי לפתור את הבעיה הזו, השתמשנו ב-Google Maps Grounding כדי להקנות ל-AI יכולת Grounding.
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 for XR כדי ליצור רכיבים מרחביים. כדי לייצג נקודות עניין לאורך הסיור, יצרנו רכיב שאפשר להרכיב ממנו ממשק שנקרא InfoSphere. הרכיב הזה מכיל GltfModel של כדור תלת-ממדי שצף בחלל, ואפשר ללחוץ עליו כדי לחשוף מידע.
באמצעות Jetpack XR SDK, אפשר למקם מודלים תלת-ממדיים לצד ממשק המשתמש של Compose באמצעות 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 יכולים ליצור חוויות מרחביות בקנה מידה עולמי בקלות רבה יותר מאי פעם. ממשק Geospatial API זמין עכשיו בגרסת טרום-השקה ב-Android XR, כך שהאפליקציות שלכם יכולות להבין בצורה חלקה את העולם הפיזי שמסביבן. באמצעות שילוב של ממשקי ה-API של Compose for XR עם נתוני המיקום ברמת דיוק גבוהה של VPS והיכולות הגנרטיביות של Gemini, אנחנו יכולים ליצור חוויות שמבינות גם איפה המשתמש נמצא וגם מה הוא רואה.
כדי לעזור לכם להתנסות ב-Android XR, אנחנו שמחים לפתוח את ההרשמה לתוכנית Android XR Developer Catalyst, שכוללת את XREAL Project Aura. החל מהיום, אתם יכולים להגיש בקשה לקבלת גישה לערכת פיתוח של XREAL Project Aura או לערכת פיתוח של משקפיים עם תצוגה פנימית בחודשים הקרובים.
*הערה: התכונה זמינה רק במכשירים נבחרים. נדרש חיבור לאינטרנט. התכונה פועלת באפליקציות ובפלטפורמות תואמות. יכולות להתקבל תוצאות שונות.
-
חדשות על מוצריםלמפתחי Android יש הרבה אפשרויות כשמדובר בסוכנים, במודלים גדולים של שפה (LLM), בכלים ובממשקי שורת פקודה (CLI) שבהם הם משתמשים לפיתוח אפליקציות. המטרה שלנו היא לעזור לכם לפתח אפליקציות יפות ואיכותיות ל-Android, לא משנה איך תבחרו לפתח אותן.
Simona Milanovic • משך הקריאה: 4 דקות -
חדשות על מוצריםב-Google Play, אנחנו מרחיבים כל הזמן את פלטפורמת המינויים שלנו כדי לעזור לכם להגדיל את הצמיחה, להתאים את עצמכם למודלים עסקיים חדשים ולהגיע למשתמשים שלכם בדיוק במקום שבו הם נמצאים.
Sheenam Mittal • משך הקריאה: 4 דקות -
חדשות על מוצריםבשנה שעברה, פתחנו את Android Studio לכל מודל AI. היום אנחנו עושים את הצעד הבא ומשיקים תמיכה בסוכני קידוד לפי בחירתכם.
Matthew Warner • משך הקריאה: 3 דקות
רוצים לקבל טיפים עדכניים לפיתוח Android ישירות לאימייל כל שבוע?