في مؤتمر Google I/O لهذا العام، أعلنا عن تحديث للتجارب المكانية: واجهة برمجة تطبيقات Geospatial متاحة الآن كمعاينة في ARCore لـ Jetpack XR. من خلال جلب نظام تحديد المواقع المرئي (VPS) من Google إلى Android XR، يتيح Android XR ربط المحتوى الرقمي بالعالم المادي بدقة تصل إلى متر فرعي وتوجيه دقيق في المناطق المدعومة.* لاستكشاف ما يمكن أن تفتحه واجهة برمجة تطبيقات Geospatial API، أنشأ فريقنا عرضًا توضيحيًا: جولة XR Geospatial Tour.
تخيل أنك تسير في مدينة جديدة، وترتدي زوجًا من نظارات XR السلكية (مثل XREAL Project Aura القادم)، وتحصل على الفور على دليل محلي واسع المعرفة يرشدك إلى المكان. لا تحتاج إلى التحديق في خريطة ثنائية الأبعاد – وبدلاً من ذلك، تقوم النماذج ثلاثية الأبعاد بتوجيه مسارك بلطف، ويخبرك صوت ذكي بالمعالم التاريخية التي أمامك مباشرةً. لقد قمنا بدمج Geospatial APIs وGemini API باستخدام Firebase AI Logic وGoogle Maps Grounding وJetpack XR SDK لإنشاء تجربة جولة غامرة بدون استخدام اليدين.
*إخلاء المسؤولية: تطبيق الفيديو والدليل السياحي مخصص للأغراض التوضيحية فقط. تم اختصار بعض التسلسلات. قد تكون أي أجهزة مصورة قيد التطوير؛ قد تختلف تفاصيل المنتج النهائي.
دعنا نستعرض تفاصيل التنفيذ ونوضح كيف قمنا بربط واجهات برمجة التطبيقات هذه معًا لبناء تجربة مكانية على مستوى عالمي.
1. تحديد المستخدم باستخدام ARCore Geospatial API (VPS)
عزز تجربة الملاحة الخاصة بك على XR من خلال الجمع بين قوة نظام تحديد المواقع العالمي (GPS) ودقة VPS. تسمح الدقة والتوجيه الدقيق الذي يأتي مع VPS لنقاط الطريق ثلاثية الأبعاد بالتوافق مع العالم المادي.
ولهذا السبب يمكن أن تساعدك Geospatial API على Android XR في بناء تجارب مخصصة. باستخدام رؤية الكمبيوتر المتقدمة، يحاول VPS توفير وضع جغرافي مكاني (بما في ذلك خطوط الطول والعرض والاتجاه) أكثر دقة من نظام تحديد المواقع العالمي (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}")
}
ونظرًا لأن التجربة بأكملها تعتمد على هذه الدقة، فإننا نراقب الدقة الأفقية والدقة الاتجاهية حتى تصل إلى حدودنا. إذا كان المستخدم في الداخل أو في منطقة غير معروفة، فإننا نطلب منه “المشي إلى مساحة عامة خارجية والنظر حوله”.
2. صياغة خط سير الرحلة باستخدام Gemini API وGoogle Maps Grounding
بمجرد أن يكون لدينا موقع، نستخدم واجهة برمجة تطبيقات Gemini باستخدام 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 لإيقاف الذكاء الاصطناعي.
3. صوت لإرشادك: Gemini 2.5 TTS
لكي يشعر المرشد السياحي بأنه حاضر حقًا، قمنا بتنفيذ تعليقات صوتية ديناميكية.
باستخدام نموذج Gemini-2.5-flash-tts، يمكننا تكوين تكوين إنشاء النموذج الخاص بنا لإرجاع البيانات الصوتية أصلاً بدلاً من النص فقط! إليك كيفية طلب 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
الجزء الأخير من اللغز هو عرض هذه البيانات في مجال رؤية المستخدم. تجعل Jetpack XR SDK من السهل الانتقال من واجهة مستخدم Android ثنائية الأبعاد إلى الحوسبة المكانية.
استخدمنا Jetpack Compose لـ XR لبناء المكونات المكانية. لتمثيل النقاط المثيرة للاهتمام على طول الجولة، قمنا ببناء ملف قابل للتركيب يسمى InfoSphere، والذي يحتوي على GltfModel لجرم سماوي ثلاثي الأبعاد يطفو في الفضاء ويمكن التفاعل معه للكشف عن المعلومات.
باستخدام Jetpack XR SDK، يمكننا وضع نماذج ثلاثية الأبعاد جنبًا إلى جنب مع Compose UI باستخدام SpatialBox وSceneCoreEntity. استخدمنا أيضًا InteractableComponent للرد على نقرات المستخدم.
@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()
}
})
}
}
)
}
}
من خلال الجمع بين AnimatedSpatialVisibility لأسطح Compose UI التقليدية وعناصر SceneCoreEntity ثلاثية الأبعاد، أصبحنا قادرين على دمج البيانات بسلاسة في العالم المادي.
اكتشف ما هو ممكن مع Android XR اليوم
أظهر لنا إنشاء تطبيق XR Geospatial Tour أن العائق أمام الدخول إلى التجارب المكانية ذات المستوى العالمي أصبح أقل من أي وقت مضى بالنسبة لمطوري Android. بفضل واجهة Geospatial API المتوفرة الآن للمعاينة على Android XR، يمكن لتطبيقاتك فهم العالم المادي من حولها بسلاسة. من خلال الجمع بين واجهات برمجة تطبيقات Compose for XR وبيانات الموقع عالية الدقة لـ VPS والإمكانيات التوليدية لـ Gemini، يمكننا إنشاء تجارب تفهم مكان وجود المستخدم وما ينظر إليه.
لمساعدتك في التدريب العملي على نظام Android XR، يسعدنا أن نفتح تطبيقات لبرنامج Android XR Developer Catalyst Program، والذي يتضمن XREAL Project Aura. بدءًا من اليوم، يمكنك التقدم بطلب للوصول إلى مجموعة XREAL Project Aura devkit أو مجموعة نظارات العرض الخاصة بنا خلال الأشهر القادمة!

