最近專案中要在安卓端的WebView或XWalkView中加載一個大型三維模型(實際上是使用threejs方法加載的),有一兩百M大。我嘗試了多種方法:
1. 放在assets檔案夾中,打包進apk。好像assets檔案夾中有單個檔案大小上限。檔案過大會報錯。
2. 放到Android模擬器本地(我放在storage/emulated/0/DownLoad檔案夾下),但是在js中這個檔案的路徑不知道該怎么寫。
問題總結一下就是:
(因為要寫在js中)安卓模擬器的storage/emulated/0/DownLoad/model.obj的絕對路徑是什么?
或者在js寫相對路徑的方法是什么?
這幾個絕對路徑我都試過了,不對:
"/storage/emulated/0/DownLoad/model.obj"
"/DownLoad/model.obj"
uj5u.com熱心網友回復:
應該和android原始碼互動得到吧,應該不能直接訪問sd卡里面的檔案uj5u.com熱心網友回復:
Android代碼中要宣告相應的JavaScriptInterface的方法,以此方法供js進行呼叫。那么你可以在這個方法中進行你的下一步操作:
Environment.getExternalStorageDirectory()——>這個是獲取外部存盤的路徑(因為不同的設備可能路徑有點不同,所以用這個方法就可以獲取對應的存盤目錄,然后拼接上你的檔案夾、檔案名字)
uj5u.com熱心網友回復:
頂貼頂貼頂貼uj5u.com熱心網友回復:
Environment.getExternalStorageDirectory()+檔案路徑,這個字串傳遞給js,js是無法找到檔案的,正如1樓所說。
但是如果用java代碼直接加載檔案放到快取,等于是把加載到的資料賦值給一個變數。而我最終是要在js中分析、處理并顯示這個模型資料的,但是這個變數要如何才能傳給js呢?
其實可行的方法就兩種:
一是,在js中加載資料(貌似找不到安卓本地檔案,Environment.getExternalStorageDirectory()+檔案路徑也沒用);
二是,在java中加載資料(貌似獲得的變數傳不到js里)。
到底該咋辦啊??
我很方!!
uj5u.com熱心網友回復:
你先通過手機查看是否將檔案下載到了本地,然后寫死這個檔案來獲取
uj5u.com熱心網友回復:
Android代碼中要宣告相應的JavaScriptInterface的方法,以此方法供js進行呼叫。
那么你可以在這個方法中進行你的下一步操作:
Environment.getExternalStorageDirectory()——>這個是獲取外部存盤的路徑(因為不同的設備可能路徑有點不同,所以用這個方法就可以獲取對應的存盤目錄,然后拼接上你的檔案夾、檔案名字)
Environment.getExternalStorageDirectory()+檔案路徑,這個字串傳遞給js,js是無法找到檔案的,正如1樓所說。
應該和android原始碼互動得到吧,應該不能直接訪問sd卡里面的檔案
但是如果用java代碼直接加載檔案放到快取,等于是把加載到的資料賦值給一個變數。而我最終是要在js中分析、處理并顯示這個模型資料的,但是這個變數要如何才能傳給js呢?
其實可行的方法就兩種:
一是,在js中加載資料(貌似找不到安卓本地檔案,Environment.getExternalStorageDirectory()+檔案路徑也沒用);
二是,在java中加載資料(貌似獲得的變數傳不到js里)。
到底該咋辦啊??
我很方!!
你先通過手機查看是否將檔案下載到了本地,然后寫死這個檔案來獲取
手機上有檔案關鍵是怎么在內嵌h5獲取檔案?我也遇到了這個問題,在h5路徑應該怎么寫?
uj5u.com熱心網友回復:
webview訪問檔案一般是重寫MyWebChromeClient的openFileChooser(4.4和4.4.3的,沒有Override)和onShowFileChooser(5.0及以后的)

openFileChooser直接回傳檔案路徑即可
onShowFileChooser需要將檔案轉換為媒體資料才能被使用,下面是把圖片路徑轉換為媒體打代碼
public static Uri getMediaContentUri(String absolutePath) {
Uri newUri;
// 先查找是否有這個uri
Cursor cursor = MyLibsApp.mApp.getContentResolver().query(
MediaStore.Images.Media.EXTERNAL_CONTENT_URI,
new String[]{MediaStore.Images.Media._ID},
MediaStore.Images.Media.DATA + "=? ",
new String[]{absolutePath}, null);
if (cursor != null && cursor.moveToFirst()) {
int id = cursor.getInt(cursor.getColumnIndex(MediaStore.MediaColumns._ID));
newUri = Uri.withAppendedPath(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, String.valueOf(id));
} else {
ContentValues values = new ContentValues();
values.put(MediaStore.Images.Media.DATA, absolutePath);
newUri = MyLibsApp.mApp.getContentResolver().insert(MediaStore.Images.Media.EXTERNAL_CONTENT_URI, values);
}
if (cursor != null)
cursor.close();
return newUri;
}
然后回傳過去就行了
filePathCallback.onReceiveValue(new Uri[]{FileUtils.getMediaContentUri(resultList.get(0).getPhotoPath())});
或者你復制到自己的快取目錄再把絕對路徑傳給h5試試(理論上可行,沒試過)
uj5u.com熱心網友回復:
樓主解決了么,我也遇到一樣問題了uj5u.com熱心網友回復:
臨時措施,看能不能用java把檔案復制到能呼叫的地方,然后用js讀取uj5u.com熱心網友回復:
Android代碼中要宣告相應的JavaScriptInterface的方法,以此方法供js進行呼叫。
那么你可以在這個方法中進行你的下一步操作:
Environment.getExternalStorageDirectory()——>這個是獲取外部存盤的路徑(因為不同的設備可能路徑有點不同,所以用這個方法就可以獲取對應的存盤目錄,然后拼接上你的檔案夾、檔案名字)
Environment.getExternalStorageDirectory()+檔案路徑,這個字串傳遞給js,js是無法找到檔案的,正如1樓所說。
應該和android原始碼互動得到吧,應該不能直接訪問sd卡里面的檔案
但是如果用java代碼直接加載檔案放到快取,等于是把加載到的資料賦值給一個變數。而我最終是要在js中分析、處理并顯示這個模型資料的,但是這個變數要如何才能傳給js呢?
其實可行的方法就兩種:
一是,在js中加載資料(貌似找不到安卓本地檔案,Environment.getExternalStorageDirectory()+檔案路徑也沒用);
二是,在java中加載資料(貌似獲得的變數傳不到js里)。
到底該咋辦啊??
我很方!!
臨時措施,用java把檔案復制到app目錄下,然后用js讀取,然后洗掉
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/67324.html
標籤:Android
