Android webview如何使用loadDataWithBaseURL方法从assets文件夹加载图片?

11

在我的项目中,我有一些文件:

"MyProject/assets/folder1/image1.jpg"
"MyProject/assets/folder1/index.html".
在webView中,我需要打开带有图片的index.html。
我正在尝试这段代码:
String baseUrl = "file:///android_asset/folder1/";
webView.loadDataWithBaseURL(baseUrl, readFileAsString("index.html") , mimeType, "UTF-8", null);
但是图片无法加载。
如果我将图片放入“assets”目录(MyProject/assets/)并设置baseUrl = "file:///android_asset",图片会被正确加载;
如何从不仅限于根目录的资产目录和assets/folder1中加载图片?

我之前看到一篇关于这个主题的长文。如果你仍然需要帮助,请查阅它。http://devblog.morethanheroic.com/2017/01/03/how-to-create-an-app-from-a-static-website/ - Lakatos Gyula
4个回答

16

试试这样

WebView webview = (WebView)this.findViewById(R.id.webview);


String html = "<html><head><title>TITLE!!!</title></head>";
html += "<body><h1>Image?</h1><img src=\"icon.png\" /></body></html>";


webview.loadDataWithBaseURL("file:///android_res/drawable/", html, "text/html", "UTF-8", null); 

了解更多信息,请尝试此链接

完美的LoadDataWithBaseurl


我听说这个函数的baseURL会忽略第一个斜杠后面的任何内容。 - Darpan
baseURL 允许您从文件夹运行所有文件,例如有一个文件夹里面包含所有的 .js/.css/.html 文件,您可以通过调用 baseURL 来获取该文件夹中的 .html 文件: webview.loadDataWithBaseURL("file:///android_asset/myWebFilesInThisFolder/","<html><body><p>hello world</p></body></html>")。因此,您不必为 JS/CSS/HTML 编写全地址,只需将其捆绑在一起即可! - Bay
@Janmejoy FYI 第二个链接(LoadDataWithBaseurl)指向 http://lomza.people.totem-soft.com/?p=62,该位置似乎无效。 - Marino

5
我认为您需要将基础设定为资产,然后向图像src添加子文件夹,如下所示: webView.loadDataWithBaseURL("file:///android_asset/", readAssetFileAsString("folder1/index.html"), "text/html", "UTF-8", null); HTML代码中的图片应该写成以下形式: <img src="folder1/image1.jpg"> 这在Android 5.1上对我有效。
private String readAssetFileAsString(String sourceHtmlLocation)
{
    InputStream is;
    try
    {
        is = getContext().getAssets().open(sourceHtmlLocation);
        int size = is.available();

        byte[] buffer = new byte[size];
        is.read(buffer);
        is.close();

        return new String(buffer, "UTF-8");
    }
    catch(IOException e)
    {
        e.printStackTrace();
    }

    return "";
}

1
新增方法代码,这段代码之前是从另一篇SO帖子中获取的,但不幸的是我没有链接来归功于他们。 - behelit

1

试着喜欢这个

try {
            String filePath = null;
            filePath = "Your File path";
            Bitmap bitmap = null;

            bitmap = BitmapFactory.decodeFile(filePath);
            Log.v("Image data-->", "" + bitmap);
            imageWidth = bitmap.getWidth();
            imageHeight = bitmap.getHeight();
            Log.e("Width", "" + imageWidth);
            filePath = "file://" + filePath;
            String html = "<html xmlns=\"http://www.w3.org/1999/xhtml\"><head><meta http-equiv=\"Content-Type\" content=\"text/html\";charset=utf-8\"/><title></title></head><body style=\"width:"
                    + imageWidth
                    + "px; height:"
                    + imageHeight
                    + "px; background:url("
                    + filePath
                    + ") no-repeat; position:relative;\">"
                    + getDivTag(mapList)
                    + "</body></html>";

            Log.v("MIS", "" + html);
            webview.getSettings().setSupportZoom(true);
            webview.loadDataWithBaseURL(null, html, "text/html", "utf-8", null);

            System.out.println(html);

        } catch (Exception e) {
            e.printStackTrace();
        }

-15

你是否已经授予了网络权限?

<uses-permission android:name="android.permission.INTERNET" />

真的吗?如果他说把它们放在一个文件夹中运行良好,那就意味着他必须已经设置了权限。 - Darpan
@Darpan 答案完全不相关,你的评论也是如此。这个可以工作是因为 OP 的资源是本地的,不需要互联网权限。简单地说,“他一定已经放置了权限”是无效的论点。 - Farid

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接