我正在开发一种共享增强现实体验,我想知道是否存在一种很好的方法来了解何时由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,代码都会检查锚点的状态,因此我认为这一定是实现它的更好方法。有想法吗?