ARCore的跟踪状态在TRACKING与 PAUSED之间来回切换,平面数量为0,点数量为0,hitTest总是返回空结果
症状
在调试覆盖层中:
tracking: TRACKING <-> PAUSED(闪烁)failureReason: NONE(通常)/ INSUFFICIENT_LIGHT(有时当平放在地板上时)planes: 0 /points: 0 /hits: 0
即使在对明亮有纹理的地板扫描超过30秒后,也不会检测到平面。
设备与环境
- 设备:Samsung Galaxy(Android 14)
- ARCore版本:1.52.0
- CameraX版本:1.5.3
ARCore配置
kotlin
val cfg = Config(session).apply {
planeFindingMode = Config.PlaneFindingMode.HORIZONTAL
focusMode = Config.FocusMode.AUTO
lightEstimationMode = Config.LightEstimationMode.AMBIENT_INTENSITY
depthMode = Config.DepthMode.DISABLED
updateMode = Config.UpdateMode.BLOCKING
instantPlacementMode = Config.InstantPlacementMode.DISABLED
}
session.configure(cfg)
渲染逻辑
Inside onDrawFrame() using GLSurfaceView:
Kotlin
val frame = session.update()
val camera = frame.camera
if (camera.trackingState == TrackingState.TRACKING) {
val hits = frame.hitTest(centerX, centerY)
// ...
}
重要观察
- 相机预览仅由ARCore处理(没有单独的CameraX PreviewView)。
session.resume()已被正确调用。- 同一设备上的官方AR应用工作正常。
- 我的应用以前在同一设备上也能正常工作。
问题: 什么原因可能让ARCore的跟踪在TRACKING与 PAUSED之间来回闪烁,同时又无法检测到任何平面/点?是否存在与CameraX的已知冲突,或ARCore 1.52.0的某个配置问题?
"更新:我在同一设备上测试了官方的Hello AR Kotlin示例,它也无法检测平面。它只显示闪烁的特征点。这似乎是Android 14上的设备特定ARCore回归。"
"CRITICAL UPDATE: Even Google's official 'Hello AR' Kotlin sample fails on my Galaxy (Android 14, ARCore 1.52). Feature points are visible, but Plane detection never triggers even with Depth API enabled. Is this a known regression in the 1.52 build for Samsung devices?"
解决方案
16 KB内存页问题
可能存在 16 KB page size 支持的问题,这可能会对ARCore应用的功能造成严重影响。ARCore在环境理解和相机处理方面高度依赖本地 .so 文件(C代码)。历史上,Android使用4096字节的页。当这些本地库对齐到4 KB页时,在配置为16 KB页的设备上就无法正确加载。尽管16 KB页提升了性能,但会导致更高的内部碎片化,如果你的ARCore代码使用4 KB的假设来手动管理内存,可能会导致问题(长期存在的隐式依赖)。
AR Play Services问题
ARCore v1.52/v1.53可能引入了更严格的条件来维持 TRACKING 状态,或改变了在出现诸如 insufficient features 情况、poor lighting conditions 情况、excessive motion 情况等跟踪失败原因时,该状态转变为 PAUSED 的数值阈值。这意味着早前可接受的AR环境因素在v1.52/v1.53中不再满足要求。
Google Play服务的AR可能对现有的ARCore应用施加更严格的条款和技术要求。由于ARCore功能依赖一个由Play商店自动更新的后台服务,对该服务的更改可能在开发者不提交更新的情况下影响到现有应用。
要消除闪烁并让你的AR应用恢复到之前的效果,尝试使用 ARCore 1.51。在过去的8 年里,某些版本的ARCore和 Play Services引入了大量的错误和不现实的严格要求,但迟早这些缺陷都会被修复。可以肯定,这个问题也会很快得到修复。