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);

assests フォルダーから 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

2 つのファイル パスがあるとします。

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

以下は、2 番目の存在をテストし、利用できない場合は最初のデフォルトをテストします。

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 に答える