У ARcore Cloud Anchor есть слушатель, который знает, когда был размещен Cloud Anchor? - PullRequest
0 голосов
/ 19 января 2019

Я разрабатываю опыт дополненной реальности, и мне интересно, существует ли хороший способ узнать, когда Cloud Anchor был размещен на сервере ARcore, на данный момент единственный способ, которым я знаю, это:

Это вызывается в mainActivity в функции onCreate:

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, код проверяет состояние якоря, поэтому я думаю, что должен быть лучший способ его реализовать. Какая-то идея?

...