最近项目中要在安卓端的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"

解决方案 »

  1.   

    应该和android源码交互得到吧,应该不能直接访问sd卡里面的文件
      

  2.   

    Android代码中要声明相应的JavaScriptInterface的方法,以此方法供js进行调用。
    那么你可以在这个方法中进行你的下一步操作:
    Environment.getExternalStorageDirectory()——>这个是获取外部存储的路径(因为不同的设备可能路径有点不同,所以用这个方法就可以获取对应的存储目录,然后拼接上你的文件夹、文件名字)
      

  3.   


    Environment.getExternalStorageDirectory()+文件路径,这个字符串传递给js,js是无法找到文件的,正如1楼所说。
    但是如果用java代码直接加载文件放到缓存,等于是把加载到的数据赋值给一个变量。而我最终是要在js中分析、处理并显示这个模型数据的,但是这个变量要如何才能传给js呢?其实可行的方法就两种:
    一是,在js中加载数据(貌似找不到安卓本地文件,Environment.getExternalStorageDirectory()+文件路径也没用);
    二是,在java中加载数据(貌似获得的变量传不到js里)。到底该咋办啊??
    我很方!!
      

  4.   


    Environment.getExternalStorageDirectory()+文件路径,这个字符串传递给js,js是无法找到文件的,正如1楼所说。
    但是如果用java代码直接加载文件放到缓存,等于是把加载到的数据赋值给一个变量。而我最终是要在js中分析、处理并显示这个模型数据的,但是这个变量要如何才能传给js呢?其实可行的方法就两种:
    一是,在js中加载数据(貌似找不到安卓本地文件,Environment.getExternalStorageDirectory()+文件路径也没用);
    二是,在java中加载数据(貌似获得的变量传不到js里)。到底该咋办啊??
    我很方!!
    你先通过手机查看是否将文件下载到了本地,然后写死这个文件来获取
      

  5.   


    Environment.getExternalStorageDirectory()+文件路径,这个字符串传递给js,js是无法找到文件的,正如1楼所说。
    但是如果用java代码直接加载文件放到缓存,等于是把加载到的数据赋值给一个变量。而我最终是要在js中分析、处理并显示这个模型数据的,但是这个变量要如何才能传给js呢?其实可行的方法就两种:
    一是,在js中加载数据(貌似找不到安卓本地文件,Environment.getExternalStorageDirectory()+文件路径也没用);
    二是,在java中加载数据(貌似获得的变量传不到js里)。到底该咋办啊??
    我很方!!
    你先通过手机查看是否将文件下载到了本地,然后写死这个文件来获取
    手机上有文件关键是怎么在内嵌h5获取文件?我也遇到了这个问题,在h5路径应该怎么写?
      

  6.   

    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试试(理论上可行,没试过)