ARcore Cloud Anchor有一个监听器,可以知道何时托管了Cloud Anchor?

时间:2019-01-19 10:01:22

标签: java android kotlin arcore

我正在开发一种共享增强现实体验,我想知道是否存在一种很好的方法来了解何时由ARcore服务器托管Cloud Anchor,目前我唯一知道的方法是:

这在onCreate函数的mainActivity中调用:

customArFragment.arSceneView.scene.addOnUpdateListener(arHandler::onUpdateFrame)


class ArHandler(
    val fragment: ArFragment,
    val activity: Activity,
    val snackbarHelper: SnackbarHelper
) {

    fun onUpdateFrame(frameTime: FrameTime) {
        checkUpdatedAnchor()
    }

    @Synchronized
    private fun checkUpdatedAnchor() {
        if (appAnchorState != AppAnchorState.HOSTING && appAnchorState != AppAnchorState.RESOLVING) {
            return
        }
        val cloudState = cloudAnchor?.cloudAnchorState
        Log.i("CheckUpdatedAnchor", cloudState.toString())

        if (appAnchorState === AppAnchorState.HOSTING) {
            if (cloudState != null) {
                if (cloudState.isError) {
                    snackbarHelper.showMessage(
                        activity,
                        activity.getString(R.string.hosting_error) + cloudState
                    )
                    appAnchorState = AppAnchorState.NONE
                } else if (cloudState == Anchor.CloudAnchorState.SUCCESS) {
                    appAnchorState = AppAnchorState.HOSTED

                    if (anchorTask == AnchorTask.CREATE) {
                        storeManager.nextShortCode(object : StoreManager.ShortCodeListener {
                            override fun onShortCodeAvailable(shortCode: Int?) {
                                myShortCode = shortCode
                                if (shortCode == null) {
                                    snackbarHelper.showMessage(
                                        activity, "Could not get shortCode"
                                    )
                                    return
                                }
                                cloudAnchor?.let {
                                    storeManager.storeUsingShortCode(shortCode, it.cloudAnchorId)
                                }

                                snackbarHelper.showMessage(
                                    activity, "Anchor hosted! Cloud Short Code: " +
                                            shortCode
                                )

                            }
                        })
                    } else if (anchorTask == AnchorTask.UPDATE) {
                        myShortCode?.let { sc ->
                            cloudAnchor?.let { ca ->
                                storeManager.updateCloudAnchorID(
                                    sc,
                                    ca.cloudAnchorId
                                )
                                snackbarHelper.showMessage(
                                    activity, "Anchor Updated!: " + myShortCode
                                )
                            }
                        }
                    }
                }

            }
        } else if (appAnchorState == AppAnchorState.RESOLVING) {
            if (cloudState != null) {
                if (cloudState.isError) {
                    snackbarHelper.showMessage(
                        activity, "Error resolving anchor.. "
                                + cloudState
                    )
                    appAnchorState = AppAnchorState.NONE
                } else if (cloudState == Anchor.CloudAnchorState.SUCCESS) {
                    snackbarHelper.showMessage(
                        activity, "Anchor resolved successfully"
                    )
                    appAnchorState = AppAnchorState.RESOLVED
                }
            }
        }
    }

    fun createCloudAnchor(customArFragment: CustomArFragment, anchor: Anchor) {
        this.cloudAnchor =
                customArFragment.arSceneView.session.hostCloudAnchor(anchor)
        this.anchorTask = AnchorTask.CREATE
        this.appAnchorState = ArHandler.AppAnchorState.HOSTING
        snackbarHelper.showMessage(activity, activity.getString(R.string.hosting_anchor))

        this.cloudAnchor?.let {
            this.placeObject(it, Uri.parse("ArcticFox_Posed.sfb"))
        }
    }

}

我认为这是实现“侦听器”的一种不好方法,因为无论SceneForm是否向您发送一个Frame,代码都会检查锚点的状态,因此我认为这一定是实现它的更好方法。有想法吗?

0 个答案:

没有答案