1
    String filename = "file:///android_asset/Help_ja.html";
    File f = new File(filename);
    if (!f.exists()) filename="file:///android_asset/Help_us.html";
    webView.loadUrl(filename);

我从assets文件夹中加载了一个HTML,两个文件都在那里,当我尝试这段代码时:

filename="file:///android_asset/Help_us.html";
webView.loadUrl(filename);

它起作用了,但由于某种原因 f.exists() 返回 false,我在想可能是因为 URL,但是在将文件加载到 webView 之前如何检查文件是否存在?

4

3 回答 3

3

在代码中适用于我的解决方案:

private static boolean assetExists(AssetManager assets, String name) {
    try {
        // using File to extract path / filename
        // alternatively use name.lastIndexOf("/") to extract the path
        File f = new File(name);
        String parent = f.getParent();
        if (parent == null) parent = "";
        String fileName = f.getName();
        // now use path to list all files
        String[] assetList = assets.list(parent);
        if (assetList != null && assetList.length > 0) {
            for (String item : assetList) {
                if (fileName.equals(item))
                    return true;
            }
        }
    } catch (IOException e) {
        // Log.w(TAG, e); // enable to log errors
    }
    return false;
}

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);
    // test for file:///android_asset/Help_ja.html
    boolean exists1 = assetExists(getAssets(), "Help_ja.html"));
    // and if assets are in subfolders
    // would be ./assets/www/test2.hml in your project
    boolean exists2 = assetExists(getAssets(), "www/test2.html");
}

资产文件不是设备上的物理文件,因此您不能使用File它们。阅读其内容的唯一方法是通过AssetManager. 上面的示例代码使用该list()方法列出资产文件并检查您搜索的列表。例如,您也可以尝试打开一个InputStream

于 2012-11-13T17:22:30.993 回答
3

假设您有两个文件路径:

String originalPath = "file:///android_asset/..."
String localizedPath = "file:///android_asset/..."

以下将测试第二个是否存在,如果不可用则默认为第一个:

String localizedAssetPath = localizedPath.replace("file:///android_asset/",  "");
try {
  InputStream stream = getResources().getAssets().open(localizedAssetPath);
  stream.close();
  return localizedPath;
}
catch (Exception e) {
  return originalPath;
}

因此,基本上,您删除了file:///android_asset/基本路径并尝试将其作为流打开。如果失败,则默认使用原始路径。

于 2013-07-28T17:10:59.077 回答
1

文件不需要 URL,它需要路径。所以它不应该以 File:/// 开头,它应该以 / 开头(绝对路径)或第一个目录名称(相对路径)。

如果您需要在将其加载到 URL 之前检查它是否存在,请在传递给 File 构造函数之前从字符串中剥离协议。如果将 URL 加载到 URL 对象中,则可以使用 getPath() 和 getFile() 作为助手

于 2012-11-13T16:44:44.540 回答