使用Android Studio将html文件从assets文件夹加载到android上的webview

问题描述 投票:0回答:5

我正在使用 Android Studio/Gradle。

app\src\main ndroid_asset文件夹中有一个名为chart.html的文件..

我正在尝试将此文件加载到我的网络视图中,如下所示:

WebView view = new WebView(this);
view.getSettings().setJavaScriptEnabled(true);
view.loadUrl("file:///android_asset/chart.html");
setContentView(view);

但我总是收到错误:无法加载,因为 ERR_FILE_NOT_FOUND。

我在这里缺少什么?

java android webview android-studio gradle
5个回答
61
投票

目录名称应该是 assets 而不是 android_assets

这样做:enter image description here

如上图所示,只需右键单击您的应用程序->新建->文件夹->资产文件夹

现在将您的 .html 文件放入 assets 文件夹中。

就是这样。完成。

其余代码与您所做的相同。

WebView view = new WebView(this);
view.getSettings().setJavaScriptEnabled(true);
view.loadUrl("file:///android_asset/hello.html");
setContentView(view);

11
投票

类似问题:

我使用了许多具有不同 applicationId 的 ProductFlavors。

如果我尝试从 res/raw/file.html 加载 html 文件,我会得到一个 ClassNotFoundException 找不到类“product.flavor.package.R$raw”

R.java 文件具有不同的包名称。

看起来您无法从文件加载 URL,例如: webView.loadUrl(“文件:///android_res/raw/page.html”); 因为 WebView 尝试使用具有不同包名称的 R.class 文件。

我假设从资产加载 html 文件时出现 ERR_FILE_NOT_FOUND 也有同样的问题,但您没有看到异常。 ( webView.loadUrl( "file:///android_assets/page.html" ); )

通过这个小工作,我解决了我的问题:

try {
        AssetManager assetManager = context.getAssets();
        InputStream stream = assetManager.open("page.html");
        BufferedReader r = new BufferedReader(new InputStreamReader(stream));
        StringBuilder total = new StringBuilder();
        String line;
        while ((line = r.readLine()) != null) {
            total.append(line).append("\n");
        }
        webView.loadDataWithBaseURL(null, total.toString(), "text/html", "UTF-8", null);
    } catch (Exception xxx) {
        Log.e(TAG, "Load assets/page.html", xxx);
    }

我希望这有帮助。 斯蒂芬


0
投票

来自 Gugelhupf 的回答,但带有原始资源。
此解决方案的优点:您可以继续进行翻译!

WebView webView = findViewById(R.id.about_text);
try {
  InputStream inputStream = getResources().openRawResource(R.raw.about);
  BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
  StringBuilder stringBuilder = new StringBuilder();
  String line;
  while ((line = bufferedReader.readLine()) != null) {
    stringBuilder.append(line).append("\n");
  }
  webView.loadDataWithBaseURL(null, stringBuilder.toString(), "text/html", "UTF-8", null);
} catch (IOException e) {
  e.printStackTrace();
}

0
投票

从 SDK 30 开始,还需要调用

setAllowFileAccess(true)

WebView view = new WebView(this);
view.getSettings().setJavaScriptEnabled(true);
view.getSettings().setAllowFileAccess(true); // <-
view.loadUrl("file:///android_asset/hello.html");
setContentView(view);

0
投票

使用WebViewClientCompat和WebViewAssetLoader加载本地资源html。 WebViewClientCompat 是 androidx.webkit:webkit 的一部分,您需要在 build.gradle.kts (Module :app) 中导入它:

implementation("androidx.webkit:webkit:1.11.0")

按照 https://developer.android.com/develop/ui/views/layout/webapps/load-local-content 的说明进行操作。 您需要创建 LocalContentWebViewClient.java,只需复制上面指令示例中的代码即可。

将 html 加载到 Web 视图中:

WebView view = new WebView(this);
view.getSettings().setJavaScriptEnabled(true);
WebViewAssetLoader assetLoader = new WebViewAssetLoader.Builder()
         .addPathHandler("/assets/", new WebViewAssetLoader.AssetsPathHandler(this))
         .addPathHandler("/res/", new WebViewAssetLoader.ResourcesPathHandler(this))
         .build();
mWebView.setWebViewClient(new LocalContentWebViewClient(assetLoader));
view.loadUrl("file:///android_asset/hello.html");
© www.soinside.com 2019 - 2024. All rights reserved.