这篇文章的原作者是 Autodesk ADN 的 Adam Nagy,以下以我简称。
对 Forge Viewer 熟悉的朋友都知道可以透过 Viewer 在任何已支持的浏览器上观看模型,当然透过 Android 上的浏览器也是可以的。但有些朋友偏好将 Forge Viewer 镶嵌到移动端应用(Native App)里,所以我们提供了这一个示例:
https://github.com/Autodesk-F...
但在 Adnroid 上实作离线导览模型会有什么问题?主要是我们的 viewer 的代码是使用 HTTP/HTTPS 通信协议实作的,并不支持 file:// 这种档案协议,所以他没办法透过 file:// 这个协议从本地存储上载入模型文档。
但我必需从本地存储上载入模型文档要怎么办呢?针对这个问题最通常的解法是在建置一个本地的 HTTP 服务器,让 viewer 可以 HTTP/HTTPS 协议来访问模型文档,而这个方法在 Android 上也是可行的。
还有另一个可行的办法是去覆载Android应用的 WebView 元件的文档载入方式让 viewer 可以从本地存储解析模型文档,这也是今天要讨论的内容。首先,我们必需在AndroidManifest.xml里设置网络访问权限给我们的 Android 应用:
...
<uses-permission android:name="android.permission.INTERNET" />
</manifest>
在来我们必需解决针对 Forge 模型压缩文档的文档大小超过 Android 本地文档限制的问题:
https://stackoverflow.com/que...
在这边我们透过『把 gz 文档改名为 gz.mp3,在来把这些文档放到 WebView 的文档载入机制里』的这个方法来解决这个问题,以下是我使用的代码片段:
class ViewerWebViewClient extends WebViewClient {
Context context;
public ViewerWebViewClient(Context con) {
this.context = con;
}
public WebResourceResponse shouldInterceptRequest (WebView view,
WebResourceRequest request) {
try {
Uri uri = request.getUrl();
String path = uri.getPath();
if (path.startsWith("/android_asset/")) {
try {
AssetManager assetManager = this.context.getAssets();
String relPath = path.replace("/android_asset/", "").replace("gz", "gz.mp3");
InputStream stream = assetManager.open(relPath);
return new WebResourceResponse(null, null, stream);
} catch (IOException ex) {
String str = ex.getMessage();
}
}
} catch (Exception ex) { }
return null;
}
}
不过这个方法只适用实体装置上,在 Android 的虚拟机没办法使用,因为 viewer 会尝试以 blob:file:xxx 的方式来解析模型文档,但最终会解析会失败。
本文章用到的 Android Studio 工程可以在这边下载:
https://github.com/adamenagy/...
如果想要测试本文章的内容,必需从 Autodesk Forge 服务器上下载 SVF 模型文档,可以看看 Philippe 大神的这篇博客:
https://forge.autodesk.com/bl...
一但获取 SVF 文档后,我们就可以将它方置到 Android Studio 工程的 assets/html 文件夹里。下面这张截图是在我的 Android 装置上运行的结果:
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。