這篇文章的原做者是 Autodesk ADN 的 Adam Nagy,如下以我簡稱。html
對 Forge Viewer 熟悉的朋友都知道能夠透過 Viewer 在任何已支持的瀏覽器上觀看模型,固然透過 Android 上的瀏覽器也是能夠的。但有些朋友偏好將 Forge Viewer 鑲嵌到移動端應用(Native App)裏,因此咱們提供了這一個示例:
https://github.com/Autodesk-F...node
但在 Adnroid 上實做離線導覽模型會有什麼問題?主要是咱們的 viewer 的代碼是使用 HTTP/HTTPS 通訊協議實做的,並不支持 file:// 這種檔案協議,因此他沒辦法透過 file:// 這個協議從本地存儲上載入模型文檔。android
但我必需從本地存儲上載入模型文檔要怎麼辦呢?針對這個問題最一般的解法是在建置一個本地的 HTTP 服務器,讓 viewer 能夠 HTTP/HTTPS 協議來訪問模型文檔,而這個方法在 Android 上也是可行的。git
還有另外一個可行的辦法是去覆載Android應用的 WebView 元件的文檔載入方式讓 viewer 能夠從本地存儲解析模型文檔,這也是今天要討論的內容。首先,咱們必需在AndroidManifest.xml裏設置網絡訪問權限給咱們的 Android 應用:github
... <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...this
一但獲取 SVF 文檔後,咱們就能夠將它方置到 Android Studio 工程的 assets/html 文件夾裏。下面這張截圖是在個人 Android 裝置上運行的結果: