Forge模型转换和网页浏览在Android上的实践
大家知道,AutodeskForge大部分是网络服务(webservice)的形式,在任何系统里只要能调用web service就可以使用。而网页浏览的Forge Viewer API基于WebGL技术,只要支持WebGL的浏览器就能加载,包括移动端。本期来看一下Android上此过程的实践。
本样例源代码在:https://github.com/Autodesk-F...
该样例演示了从获取token,创建bucket,上载Android存储的文件到Forge,启动转换服务,获取转换状态,直到得到转换完毕后模型的缩略图,最后启动一个网页打开这个模型。
三年前,此样例是基于Eclipse+ Android ADT开发。而就在2015年,Android正式宣布不再支持Android的ADT,官方支持的开发平台为Android Studio。两个平台在很多方面是类似的,但Android Studio在开发界面和工具,项目层次结构,模块依赖关系,打包方式等方面都有优化之处。这些都加快了样例代码的移植过程。这里有篇文章做了更多的对比介绍:
https://www.airpair.com/andro...
源码的ReadMe有详细的安装过程,这里有几点分享:
- 以前的代码,当时还没有Forge JAVA SDK,所以所有对Forge服务调用和处理都是从头撰写,而现在既然有了Forge JAVA SDK,直接拿来用。
https://github.com/Autodesk-F...
此SDK很好的设计了异步调用,错误处理,而且包含了大部分Forge现有的服务端口。便于拓展测试。下载SDK后,通过其它合适的方式编译得到,笔者用的是Intelli IDEA。编译后在target文件夹得到的是所有依赖jar包。把它们拷贝到Android Studio项目中的lib文件夹。有两个jar包(httpcore-4.4.1.jar and httpclient-4.5.jar)不需要,因为高版本的Android SDK已经有新的http 调用库。
- SDK对Forge的调用是异步的,但这些过程不能直接在Android的主线程中执行,需要用AsyncTask封装,所以样例对每一步都做了一个AsyncTask,AsyncTask:: doInBackground,执行,然后得到结果。在以前的代码,AsyncTask:: doInBackground 得到结果后,例如token,将在对应的TextView中显示出这个字串。但移植中发现这会造成一个错误:
Only the original threadthat created a view hierarchy can touch its views.
这是因为doInBackground属于隐藏辅助线程,不能在这里对主线程的UI进行修改。经过研究,在AsyncTask::doInBackground调用publishProgress 方法通知变化,而在AsyncTask::onProgressUpdate修改TextView
- 在上载模型这一步,样例设计的是从Android的扩展存储中拿文件,在开发测试中,我们需要放一些文件在仿真器(Emulator)里,不知何故,小编的Android Device Monitor无法打开,在尝试各种方式无果后,通过命令行方式Put了一些文件。也好用。
https://stackoverflow.com/que...
- 最后一点挺有意思,虽然#3中放了文件,Environment.getExternalStorageDirectory() 没有返回任何文件。但有关的permission是打开的
<uses-permissionandroid:name="android.permission.WRITE_EXTERNAL_STORAGE"/>
<uses-permissionandroid:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permissionandroid:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS"/>
以前版本并未发生此现象。经过排查,最后发现可能是从Android 6.0开始,app的有关权限并未在安装时自动根据Manifest.xml激活,需要额外的步骤(ActivityCompat.requestPermissions)授权激活,
https://developer.android.com...
本样例仍旧保留了这个方法,以备用。
- 转换成功后,本例用新的网页框架加载模型:
https://models.autodesk.io/vi...
在弹出的浏览器中就可以看到模型了。
下一步是尝试研究只用原生的WebView控件把Forge Viewer集成到app中,而不用额外的集成框架封装。
欢迎分享您在Android开发上的宝贵经验!