Android Kotlin ARCore GeoSpatial API类型不匹配错误排查求助
解决ARCore地理空间应用中的类型不匹配与AR锚点不显示问题
一、类型不匹配错误的解决
你遇到的type mismatch: inferred type is Earth? but Earth was expected错误,根源在于:
session.earth返回的是可空类型Earth?,但updateStatusText方法的参数要求传入非空的Earth,导致类型不兼容。- 即便忽略类型问题,当
earth为空时,直接调用earth.cameraGeospatialPose会触发空指针异常。
修复代码
把状态更新的逻辑放到earth跟踪状态的判断块内,确保earth非空且处于有效跟踪状态:
// Obtain Geospatial information and display it on the map. val earth = session.earth if (earth?.trackingState == TrackingState.TRACKING) { // The Earth object may be used here. val cameraGeospatialPose = earth.cameraGeospatialPose activity.view.mapView?.updateMapPosition( latitude = cameraGeospatialPose.latitude, longitude = cameraGeospatialPose.longitude, heading = cameraGeospatialPose.heading ) // 将状态更新移至判断块内,确保earth非空 activity.view.updateStatusText(earth, cameraGeospatialPose) }
如果需要在earth未跟踪时也显示状态,可以用安全调用处理可空情况(前提是updateStatusText支持接收可空参数):
val earth = session.earth earth?.let { nonNullEarth -> val pose = nonNullEarth.cameraGeospatialPose activity.view.updateStatusText(nonNullEarth, pose) } ?: run { // earth为空时的默认状态处理 activity.view.updateStatusText(null, null) }
二、AR锚点不显示的排查
注释状态更新行后能显示地图但锚点不出现,核心原因是AR锚点需要Earth处于TrackingState.TRACKING状态才能正常创建和显示,你可以按以下步骤排查:
- 检查锚点创建代码是否放在
earth?.trackingState == TrackingState.TRACKING的判断逻辑之后执行,确保只有当earth有效跟踪时才创建锚点。 - 确认已在Manifest中配置地理空间所需权限(
ACCESS_FINE_LOCATION、ACCESS_COARSE_LOCATION等),且设备已开启位置服务。 - 确保测试环境为室外GPS信号充足的区域,室内或信号弱的环境会导致Earth无法进入TRACKING状态,锚点自然无法显示。
内容的提问来源于stack exchange,提问作者Vakindu
相关产品推荐
相关产品推荐

