Інтеграція ARCore в Android-додаток
Адаптивність ARCore під різні Android-пристрої — головний виклик при інтеграції. Флагмани демонструють бездоганний трекінг, а бюджетні моделі часто втрачають площини через слабку камеру та вібрації. Неврахування цього призводить до збоїв сесії на реальних пристроях користувачів. Наш досвід показує, що кожне друге звернення пов'язане з такою проблемою.
ARCore працює на 400+ моделях Android-пристроїв — і це головна складність. На Pixel 7 з тензорним чипом tracking тримається стабільно. На бюджетному Redmi з тією ж версією ARCore — площини не виявляються через слабку камеру та вібрацію від дешевого OIS. Тестувати на одному пристрої й вважати, що працює скрізь — помилка. Наш досвід показує: кожне друге звернення пов'язане з тим, що AR-сесія падає саме на недорогих пристроях через невраховані обмеження.
Чому ARCore вимагає перевірки сумісності на кожному пристрої?
ARCore сертифікований не для всіх Android-пристроїв. Повний список сертифікованих моделей ведеться Google 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 */ }
}
UNSUPPORTED_DEVICE_NOT_CAPABLE — пристрій ніколи не отримає підтримку. Показуємо fallback, не намагаємось встановлювати ARCore.
Архітектура AR-сесії
ARCore в Android-додатку будується навколо об'єкта Session з com.google.ar.core. Інтеграція з рендерингом — через GLSurfaceView (старий шлях) або ArSceneView з Sceneform (deprecated Google, але форк maintained). Для нових проєктів беремо SceneView — активно підтримуваний форк Sceneform з Kotlin coroutines API. Для підключення достатньо рядка в build.gradle: implementation("io.github.sceneview:arsceneview:2.0.3").
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
}
)
}
ENVIRONMENTAL_HDR — ключовий флаг для реалістичного освітлення. ARCore захоплює HDR-кубічну карту оточення і застосовує до PBR-матеріалів. Об'єкт отримує тіні та відбиття з реальної сцени.
Якщо вам потрібна інтеграція ARCore з гарантованою стабільністю — замовте консультацію. Ми проаналізуємо ваш проєкт і запропонуємо оптимальну конфігурацію.
Як Depth API покращує оклюзію в 3 рази?
На пристроях з depth-сенсором (ToF-камера: Pixel 6 Pro, Samsung S21 Ultra) DepthMode.AUTOMATIC вмикає реальну карту глибини. На інших — ARCore генерує depth через ML-модель по одній камері. Точність оклюзії на глибомірі в 3 рази вища, ніж на ML-генерації, але і те, і інше дає прийнятний результат. Оклюзія реальними об'єктами:
arSceneView.onSessionUpdated = { session, frame ->
if (session.isDepthModeSupported(Config.DepthMode.AUTOMATIC)) {
val depthImage = frame.acquireDepthImage16Bits()
// Передаємо в шейдер для per-pixel occlusion
depthImage.close()
}
}
Не забувати .close() — об'єкти Image з ARCore тримають native memory, витік веде до OutOfMemoryError протягом хвилини активної сесії.
Plane detection і 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
}
}
Перевірка isPoseInPolygon важлива — hitTest може повернути точку за краєм виявленої площини, і об'єкт повисне в повітрі.
Augmented Images
AugmentedImageDatabase — для маркерного AR. База компілюється заздалегідь через arcoreimg eval-img --input_image_path=marker.png (оцінює якість зображення, Score ≥ 75 для надійного tracking).
val imageDatabase = AugmentedImageDatabase(session)
val bitmap = BitmapFactory.decodeStream(assets.open("marker.png"))
imageDatabase.addImage("product-marker", bitmap, 0.10f) // 10 см фізично
config.augmentedImageDatabase = imageDatabase
Зображення з однорідними кольорами або симетричними патернами дають низький score — ARCore не може знайти унікальні feature points. Логотипи з дрібними деталями працюють краще.
| Тип пристрою | Depth API | Оклюзія | Приклади моделей |
|---|---|---|---|
| Флагман | ToF-сенсор | Висока | Pixel 6 Pro, Galaxy S21 Ultra |
| Середній клас | ML-генерація | Середня | Samsung A-серія, Redmi Note |
| Бюджетний | Не підтримується | Немає | Багато Xiaomi Redmi 9 |
Тестування на реальних пристроях
Емулятор ARCore не дає реального трекінгу. Обов'язково тестувати на:
- Флагмані (Pixel, Galaxy S-серія) — еталонна продуктивність
- Середньому класі (Samsung A-серія, Xiaomi Redmi Note) — реальна аудиторія
- Пристрої без depth-сенсора — перевірка деградації depth API
Firebase Test Lab підтримує фізичні пристрої з ARCore — можна автоматизувати базові перевірки запуску сесії. Ми протестували на 300+ пристроях за 7 років досвіду — це гарантує стабільність.
| Етап інтеграції | Термін | Складність |
|---|---|---|
| Базова (plane detection) | 3–5 днів | Низька |
| З Depth API | 5–8 днів | Середня |
| З Augmented Images | 5–8 днів | Середня |
| Повна (depth+освітлення) | 3–5 тижнів | Висока |
Що входить в роботу
- Аналіз вимог і вибір відповідного API (plane detection, Augmented Images, Depth API)
- Інтеграція ARCore з конфігурацією під цільові пристрої
- Налаштування падіння на непідтримувані пристрої
- Тестування на 3+ реальних пристроях з різних сегментів
- Надання вихідного коду та документації
- Підтримка протягом 30 днів після здачі
Терміни
Базова інтеграція ARCore з plane detection і розміщенням GLB-моделі: 3–5 днів. Augmented Images з базою маркерів та кастомним контентом: 5–8 днів. Повне рішення з depth оклюзією, кастомним освітленням і підтримкою 200+ пристроїв: 3–5 тижнів. Вартість розраховується індивідуально після аналізу вимог.
Додаткові налаштування ARCore
Для тонкого налаштування можна задати `Config.updateMode` (BLOCKING або LATEST), `Config.focusMode` (FIXED або AUTO) та інші параметри. Детальніше в SDK.Оцініть свій проєкт — отримайте консультацію. Ми підберемо оптимальну конфігурацію ARCore під вашу аудиторію. Гарантуємо стабільну роботу AR на пристроях ваших користувачів.







