1

这篇文章的原作者是 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 装置上运行的结果:
OfflineViewer


康益昇
748 声望103 粉丝