You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.05 14:10:25