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