Kotlin Sceneform框架无法直接从服务器加载.sfb模型问题求助
问题解决方案
按以下顺序排查修复即可解决远程sfb模型加载不显示的问题:
- 解决Android明文HTTP限制
Android 9.0(API level 28)及以上系统默认禁止HTTP明文请求,你当前用的是HTTP地址,需要做如下配置:
在AndroidManifest.xml的<application>标签中添加属性:
android:usesCleartextTraffic="true"
正式上线建议将服务器升级为HTTPS协议,关闭明文权限保障安全。
2. 检查服务器MIME类型配置
需要确认你的文件服务器对.sfb后缀的文件配置了正确的MIME类型,推荐设置为application/octet-stream,否则Sceneform无法正确识别文件格式,会出现加载无报错但无渲染对象的问题。
3. 验证网络连通性
先在测试设备的系统浏览器中输入你的模型地址http://10.0.0.193:90/fbx/A320_Anim.sfb,确认可以正常下载模型文件,排除服务器配置、局域网连通性问题。
4. 优化代码加载逻辑
你当前将按钮点击监听放在了平面点击回调中,需要先点击平面再点按钮才会触发加载,且模型加载是异步操作,建议提前预加载模型提升体验,优化后的代码参考:
@RequiresApi(Build.VERSION_CODES.N) override fun onCreate(savedInstanceState: Bundle?) { super.onCreate(savedInstanceState) setContentView(R.layout.activity_main) arFragment = sceneform_fragment as ArFragment // 启动页就预加载远程模型 preloadRemoteModel() var selectedAnchor: Anchor? = null arFragment.setOnTapArPlaneListener { hitResult, plane, _ -> if (plane.type != Plane.Type.HORIZONTAL_UPWARD_FACING) return@setOnTapArPlaneListener selectedAnchor = hitResult.createAnchor() Toast.makeText(this, "平面已选中,点击放置按钮即可显示模型", Toast.LENGTH_SHORT).show() } btnStart.setOnClickListener { when { rendarable == null -> Toast.makeText(this, "模型还在加载中,请稍候再试", Toast.LENGTH_SHORT).show() selectedAnchor == null -> Toast.makeText(this, "请先点击识别到的平面", Toast.LENGTH_SHORT).show() else -> addtoScene(arFragment, selectedAnchor, rendarable) } } } @RequiresApi(Build.VERSION_CODES.N) private fun preloadRemoteModel() { ModelRenderable.builder() .setSource(this, Uri.parse(modellink)) .build() .thenAccept { rendarable = it Toast.makeText(this, "模型加载完成,可放置使用", Toast.LENGTH_SHORT).show() } .exceptionally { throwable -> runOnUiThread { AlertDialog.Builder(this) .setTitle("模型加载失败") .setMessage(throwable.localizedMessage) .show() } return@exceptionally null } }
完成以上操作后即可正常加载远程服务器的sfb模型。
内容的提问来源于stack exchange,提问作者Syed Abdul Rahim
相关产品推荐
相关产品推荐

