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

SceneForm废弃后,基于Kotlin开发具备环境识别与定位功能的Android AR应用的技术求助及资源咨询

SceneForm废弃后,基于Kotlin开发具备环境识别与定位功能的Android AR应用的技术求助及资源咨询

Hey there! 我完全懂你现在的难处——SceneForm停更后,想找纯Kotlin开发、支持环境识别+用户定位的AR入门教程真的挺费劲,尤其是作为AR新手,还需要能跟着一步步拆解代码逻辑的指南。下面我结合自己的经验给你一些方向和建议:


一、核心技术选型:放弃SceneForm,直接用ARCore原生Kotlin API

现在官方主推的AR开发方案是ARCore + Kotlin原生View/Jetpack Compose,完全不需要依赖已废弃的SceneForm核心库。ARCore本身自带环境识别(平面检测、空间锚点等)能力,再结合Android原生定位API就能实现你要的功能。

分步开发思路(带代码解释)

1. 配置项目依赖

首先在Module级build.gradle中添加ARCore相关依赖:

dependencies {
    // ARCore 核心功能库
    implementation "com.google.ar:core:1.42.0"
    // ARCore 辅助UI组件(简化AR视图搭建,非废弃的SceneForm核心)
    implementation "com.google.ar.sceneform:sceneform-ux:1.17.1"
}

注:如果不想用sceneform-ux,也可以自定义SurfaceView来渲染AR画面,但新手用辅助UI库能省不少搭建基础界面的功夫。

2. 实现环境识别(平面检测)

在Activity/Fragment中初始化AR会话,开启实时平面检测:

class ARMainActivity : AppCompatActivity() {
    private lateinit var arFragment: ArFragment
    private lateinit var arSession: Session

    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)
        setContentView(R.layout.activity_ar_main)
        
        arFragment = supportFragmentManager.findFragmentById(R.id.ar_fragment) as ArFragment
        
        // 监听AR帧更新,实时检测平面
        arFragment.arSceneView.scene.addOnUpdateListener { _ ->
            val frame = arFragment.arSceneView.arFrame ?: return@addOnUpdateListener
            // 获取当前帧中更新的平面数据
            val updatedPlanes = frame.getUpdatedTrackables(Plane::class.java)
            for (plane in updatedPlanes) {
                if (plane.trackingState == TrackingState.TRACKING) {
                    // 检测到稳定跟踪的平面,可在此处添加业务逻辑(比如标记平面)
                    Log.d("AR_DEMO", "检测到有效平面:${plane.centerPose}")
                }
            }
        }
    }

    override fun onResume() {
        super.onResume()
        try {
            // 初始化并启动AR会话
            arSession = Session(this)
            val config = Config(arSession).apply {
                // 开启平面检测模式
                planeFindingMode = Config.PlaneFindingMode.HORIZONTAL_AND_VERTICAL
            }
            arFragment.arSceneView.setupSession(arSession)
        } catch (e: UnavailableException) {
            // 处理设备不支持ARCore的情况
            Toast.makeText(this, "当前设备不支持AR功能", Toast.LENGTH_SHORT).show()
            finish()
        }
    }

    override fun onPause() {
        super.onPause()
        // 暂停AR会话,避免后台耗电或崩溃
        arFragment.arSceneView.pause()
        arSession.pause()
    }
}

这段代码的核心逻辑是:通过ARCore的ArFrame实时获取环境中的平面数据,当平面处于稳定跟踪状态时,就完成了环境识别的核心步骤。

3. 结合用户定位功能

使用Android原生的FusedLocationProviderClient获取用户位置,与AR功能结合:

// 在Activity中添加定位相关代码
private lateinit var fusedLocationClient: FusedLocationProviderClient

override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(savedInstanceState)
    // ... 之前的AR初始化代码
    fusedLocationClient = LocationServices.getFusedLocationProviderClient(this)
    
    // 申请定位权限(需在Manifest中添加ACCESS_FINE_LOCATION权限)
    if (ContextCompat.checkSelfPermission(this, Manifest.permission.ACCESS_FINE_LOCATION)
        != PackageManager.PERMISSION_GRANTED) {
        ActivityCompat.requestPermissions(this, arrayOf(Manifest.permission.ACCESS_FINE_LOCATION), 1001)
    } else {
        getCurrentLocation()
    }
}

private fun getCurrentLocation() {
    fusedLocationClient.lastLocation.addOnSuccessListener { location: Location? ->
        location?.let {
            // 获取到用户经纬度信息
            val latitude = it.latitude
            val longitude = it.longitude
            Log.d("AR_LOCATION", "当前位置:$latitude, $longitude")
            // 可在此处将定位数据与AR环境识别结果结合,实现业务逻辑
        }
    }
}

这样就能同时获取AR环境数据和用户的地理位置信息了。


二、适合新手的分步资源推荐

你提到官方快速入门仅涉及放置物体,那可以关注这些方向的内容:

  • ARCore官方Kotlin专属指南:官方文档中有专门的Kotlin代码示例,会一步步讲解AR会话初始化、平面检测、锚点创建等核心逻辑,还会解释每个API的作用,非常适合新手入门。
  • 社区优质教程:不少Android开发博主推出了ARCore Kotlin系列教程,会从项目搭建开始,逐步实现环境识别+定位的组合功能,还会讲解权限处理、设备兼容性等常见坑点。
  • 官方示例项目:ARCore的官方示例库中有纯Kotlin项目,你可以下载运行后逐行拆解代码,理解各模块的作用,比如平面检测的回调逻辑、定位数据的整合方式。

三、AR开发额外注意事项(Android平台)

  • 设备兼容性:不是所有Android设备都支持ARCore,开发前要确认设备在官方支持列表中,同时要在代码中处理设备不支持的情况。
  • 权限处理:除了AR所需的CAMERA权限,定位还需要ACCESS_FINE_LOCATION或ACCESS_COARSE_LOCATION,一定要做好权限申请的逻辑,否则功能会失效。
  • 性能优化:AR应用对设备性能要求较高,要注意及时暂停AR会话(比如Activity暂停时),避免内存泄漏和过度耗电。
  • 空间锚点的使用:如果需要将虚拟内容固定在真实环境的特定位置,ARCore的空间锚点功能可以帮你实现,这是环境识别的核心延伸功能之一。

希望这些建议能帮到你,如果有具体的代码问题,随时可以再提问哦!

备注:内容来源于stack exchange,提问作者Sanjay

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.20 12:18:00