שילוב ARCore באפליקציית אנדרואיד
ההתאמה של ARCore למכשירי אנדרואיד שונים היא האתגר המרכזי בשילוב. מכשירי דגל מספקים מעקב מושלם, בעוד שמכשירים תקציביים מאבדים לעיתים קרובות מישורים בגלל מצלמות חלשות ורעידות. התעלמות מכך מובילה לקריסות סשן במכשירי משתמשים אמיתיים. הניסיון שלנו מראה שכל פנייה שנייה קשורה לבעיה זו.
ARCore עובד על יותר מ-400 דגמי מכשירי אנדרואיד — וזה הקושי המרכזי. ב-Pixel 7 עם שבב Tensor, המעקב נשאר יציב. ב-Redmi תקציבי עם אותה גרסת ARCore, מישורים לא מזוהים בגלל מצלמה חלשה ורעידות מ-OIS זול. בדיקה על מכשיר אחד והנחה שזה עובד בכל מקום היא טעות. הניסיון שלנו: כל פנייה שנייה כוללת קריסת סשן AR דווקא במכשירים זולים בגלל מגבלות שלא נלקחו בחשבון.
למה ARCore דורש בדיקת תאימות לכל מכשיר
ARCore לא מוסמך לכל מכשירי האנדרואיד. רשימה מלאה של דגמים מוסמכים מתוחזקת על ידי גוגל ברשימת ARCore supported devices. לפני תחילת סשן, נדרשת בדיקה חובה:
val availability = ArCoreApk.getInstance().checkAvailability(context)
when (availability) {
ArCoreApk.Availability.SUPPORTED_INSTALLED -> startArSession()
ArCoreApk.Availability.SUPPORTED_NOT_INSTALLED -> promptInstall()
ArCoreApk.Availability.UNSUPPORTED_DEVICE_NOT_CAPABLE -> showFallback()
else -> {
/* SUPPORTED_APK_TOO_OLD, UNKNOWN_ERROR */
}
}val availability = ArCoreApk.getInstance().checkAvailability(context) when (availability) { ArCoreApk.Availability.SUPPORTED_INSTALLED -> startArSession() ArCoreApk.Availability.SUPPORTED_NOT_INSTALLED -> promptInstall() ArCoreApk.Availability.UNSUPPORTED_DEVICE_NOT_CAPABLE -> showFallback() else -> { /* SUPPORTED_APK_TOO_OLD, UNKNOWN_ERROR */ } } — המכשיר לעולם לא יקבל תמיכה. הצג חלופה, אל תנסה להתקין ARCore.
ארכיטקטורת סשן AR
ARCore באפליקציות אנדרואיד בנוי סביב אובייקט UNSUPPORTED_DEVICE_NOT_CAPABLE מ-Session. השילוב עם רינדור הוא דרך com.google.ar.core (הדרך הישנה) או GLSurfaceView מ-Sceneform (הוצא משימוש על ידי גוגל, אבל הפיצול מתוחזק). לפרויקטים חדשים, אנו משתמשים ב-SceneView — פיצול פעיל של Sceneform עם API של קורוטינות Kotlin. כדי להוסיף אותו, רק שורה אחת ב-ArSceneView: build.gradle.
val arSceneView = binding.arSceneView
arSceneView.onSessionCreated = { session ->
session.configure(
Config(session).apply {
planeFindingMode = Config.PlaneFindingMode.HORIZONTAL_AND_VERTICAL
lightEstimationMode = Config.LightEstimationMode.ENVIRONMENTAL_HDR
depthMode = Config.DepthMode.AUTOMATIC
}
)
}implementation("io.github.sceneview:arsceneview:2.0.3") הוא דגל מפתח לתאורה ריאלית. ARCore לוכד מפת קובייה HDR של הסביבה ומחיל אותה על חומרי PBR. האובייקט מקבל צללים והשתקפויות מהסצנה האמיתית.
אם אתה צריך שילוב ARCore עם יציבות מובטחת — בקש ייעוץ. ננתח את הפרויקט שלך ונציע את התצורה האופטימלית.
איך Depth API משפר חסימה (Occlusion) פי 3
במכשירים עם חיישן עומק (מצלמת ToF: Pixel 6 Pro, Samsung S21 Ultra), val arSceneView = binding.arSceneView arSceneView.onSessionCreated = { session -> session.configure( Config(session).apply { planeFindingMode = Config.PlaneFindingMode.HORIZONTAL_AND_VERTICAL lightEstimationMode = Config.LightEstimationMode.ENVIRONMENTAL_HDR depthMode = Config.DepthMode.AUTOMATIC } ) } מאפשר מפת עומק אמיתית. במכשירים אחרים, ARCore מייצר עומק דרך מודל ML ממצלמה אחת. דיוק החסימה בחיישן עומק גבוה פי 3 מזה שנוצר על ידי ML, אבל שניהם נותנים תוצאות מקובלות. חסימה על ידי אובייקטים אמיתיים:
arSceneView.onSessionUpdated = { session, frame ->
if (session.isDepthModeSupported(Config.DepthMode.AUTOMATIC)) {
val depthImage = frame.acquireDepthImage16Bits()
// Передаём в шейдер для per-pixel occlusion
depthImage.close()
}
}אל תשכח את ENVIRONMENTAL_HDR — אובייקטי DepthMode.AUTOMATIC מ-ARCore מחזיקים זיכרון מקורי; דליפה מובילה ל-arSceneView.onSessionUpdated = { session, frame -> if (session.isDepthModeSupported(Config.DepthMode.AUTOMATIC)) { val depthImage = frame.acquireDepthImage16Bits() // Передаём в шейдер для per-pixel occlusion depthImage.close() } } תוך דקה של סשן פעיל.
זיהוי מישורים ובדיקת פגיעה (Hit Test)
הצבת אובייקט על הקשה היא מקרה סטנדרטי:
arSceneView.onGestureListener = object : DefaultARSceneViewGestureListener(arSceneView) {
override fun onSingleTapConfirmed(e: MotionEvent): Boolean {
val hitResults = arSceneView.frame?.hitTest(e.x, e.y) ?: return false
val hitResult = hitResults.firstOrNull { hit ->
hit.trackable is Plane && (hit.trackable as Plane).isPoseInPolygon(hit.hitPose)
} ?: return false
val anchor = hitResult.createAnchor()
val node = ModelNode(modelFileLocation = "models/chair.glb")
node.anchor = anchor
arSceneView.addChild(node)
return true
}
}בדיקת .close() חשובה — Image עלול להחזיר נקודה מחוץ למישור שזוהה, מה שגורם לאובייקט לרחף באוויר.
תמונות מוגדלות (Augmented Images)
OutOfMemoryError — ל-AR מבוסס סמנים. מסד הנתונים מורכב מראש דרך arSceneView.onGestureListener = object : DefaultARSceneViewGestureListener(arSceneView) { override fun onSingleTapConfirmed(e: MotionEvent): Boolean { val hitResults = arSceneView.frame?.hitTest(e.x, e.y) ?: return false val hitResult = hitResults.firstOrNull { hit -> hit.trackable is Plane && (hit.trackable as Plane).isPoseInPolygon(hit.hitPose) } ?: return false val anchor = hitResult.createAnchor() val node = ModelNode(modelFileLocation = "models/chair.glb") node.anchor = anchor arSceneView.addChild(node) return true } } (מעריך איכות תמונה; ציון ≥ 75 למעקב אמין).
val imageDatabase = AugmentedImageDatabase(session)
val bitmap = BitmapFactory.decodeStream(assets.open("marker.png"))
imageDatabase.addImage("product-marker", bitmap, 0.10f) // 10 см физически
config.augmentedImageDatabase = imageDatabaseתמונות עם צבעים אחידים או דפוסים סימטריים מקבלות ציון נמוך — ARCore לא יכול למצוא נקודות ייחודיות. לוגואים עם פרטים עדינים עובדים טוב יותר.
| סוג מכשיר | Depth API | חסימה | דוגמאות דגמים |
|---|---|---|---|
| דגל | חיישן ToF | גבוהה | Pixel 6 Pro, Galaxy S21 Ultra |
| בינוני | ייצור ML | בינונית | Samsung A-series, Redmi Note |
| תקציבי | לא נתמך | אין | רבים מ-Xiaomi Redmi 9 |
בדיקה על מכשירים אמיתיים
האמולטור של ARCore לא מספק מעקב אמיתי. חייבים לבדוק על:
- דגל (Pixel, Galaxy S-series) — ביצועי בסיס
- בינוני (Samsung A-series, Xiaomi Redmi Note) — קהל משתמשים אמיתי
- מכשיר ללא חיישן עומק — בדיקת ירידת ביצועי Depth API
Firebase Test Lab תומך במכשירים פיזיים עם ARCore — אפשר לבצע אוטומציה של בדיקות השקת סשן בסיסיות. בדקנו על 300+ מכשירים במשך 7 שנות ניסיון — זה מבטיח יציבות.
| שלב שילוב | לוח זמנים | מורכבות |
|---|---|---|
| בסיסי (זיהוי מישורים) | 3–5 ימים | נמוכה |
| עם Depth API | 5–8 ימים | בינונית |
| עם תמונות מוגדלות | 5–8 ימים | בינונית |
| מלא (עומק+תאורה) | 3–5 שבועות | גבוהה |
מה כלול
- ניתוח דרישות ובחירת API מתאים (זיהוי מישורים, תמונות מוגדלות, Depth API)
- שילוב ARCore עם תצורה למכשירי יעד
- חלופה אלגנטית למכשירים לא נתמכים
- בדיקה על 3+ מכשירים אמיתיים מפלחים שונים
- מסירת קוד מקור ותיעוד
- תמיכה ל-30 יום לאחר המסירה
לוחות זמנים
שילוב ARCore בסיסי עם זיהוי מישורים והצבת מודל GLB: 3–5 ימים. תמונות מוגדלות עם מסד סמנים ותוכן מותאם: 5–8 ימים. פתרון מלא עם חסימת עומק, תאורה מותאמת ותמיכה ב-200+ מכשירים: 3–5 שבועות. העלות מחושבת בנפרד לאחר ניתוח דרישות.
הגדרות ARCore נוספות
לכיוונון עדין, ניתן להגדיר `Config.updateMode` (BLOCKING או LATEST), `Config.focusMode` (FIXED או AUTO), ופרמטרים נוספים. פרטים נוספים ב-SDK.הערך את הפרויקט שלך — קבל ייעוץ. נבחר את תצורת ARCore האופטימלית לקהל שלך. אחריות לביצועי AR יציבים במכשירי המשתמשים שלך.







