如何在Android中的Webview中从内部存储加载图像?

5
我们希望在Webview中离线显示HTML页面及其内容,如文本、图像等。我们只能显示文本。对于图片,我们将其从图像URL存储到内部存储器(SD卡)中,并用该图像内部存储器(SD卡)路径替换图像URL(服务器URL)。但是,在Webview中无法显示这些图片。
例如,下面是HTML中的img标签...
<img alt="img" class="center_top_img" src="http://test.com/uploads/section/images/523.jpg" /> 

我们正在将上述图像URL(服务器URL)替换为图像内部存储(SD卡)路径,例如:
<img alt="img" class="center_top_img" src=\"file:///data/data/com.app.test/files/523.jpg\" /> 

你是否检查替换路径是否有效?即检查文件是否存在于相同路径上。如果它是有效的,则使用基础URL加载数据:==>webView.loadDataWithBaseURL("", html, "text/html","utf-8", ""); <==请参见此处:https://dev59.com/PG445IYBdhLWcg3wE2Re#5055471 - Ravi Jaggarapu
是的,路径是有效的。文件存在那里。我们已经这样替换了URL:<img alt="img" class="center_top_img" src="file:///data/data/com.app.test/files/1450867325060.jpg">并且还使用了webView.loadDataWithBaseURL("", html, "text/html","utf-8", ""); 但它没有起作用。 - user4928952
你能分享一下你的代码吗? - Ravi Jaggarapu
使用Environment.getExternalStorageDirectory()路径,在WebView中显示图像,但是使用getFilesDir()时,图像存储在data/data/com.yourapp/files/路径中,但是它没有显示。请告诉我们是否有任何错误操作。 - user4928952
4个回答

3

无论图像在何处,只需获取其绝对路径并事先添加"file://"即可。

File file = ...
String imagePath + "file://" + file.getAbsolutePath();
String html = "...<img src=\""+ imagePath + "\">...";

2

试试这个

mWebView = (WebView) findViewById(R.id.webview);
mWebView.getSettings().setAllowFileAccess(true);
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.getSettings().setBuiltInZoomControls(true);
String base = Environment.getExternalStorageDirectory().getAbsolutePath().toString();
String imagePath = "file://"+ base + "/test.jpg";
String html = "<html><head></head><body><img src=\""+ imagePath + "\"></body></html>";
mWebView.loadDataWithBaseURL("", html, "text/html","utf-8", "");  

谢谢您的回答。但是它没有起作用。我们已经像这样替换了URL:<img alt="img" class="center_top_img" src="file:///data/data/com.app.test/files/1450867325060.jpg">。 - user4928952

1

请记住,您的图像位于应用程序目录中。 您可以使用以下方法:

<img src="file:///data/data/com.yourapp/files/yourimage.jpg" />

谢谢你的回答。使用Environment.getExternalStorageDirectory()路径,在webview中显示图像,但是使用getFilesDir()时,图像存储在data/data/com.yourapp/files/路径中,但不会显示。如果我们做错了什么,请告诉我。 - user4928952

0
在我的情况下,我希望图像存储在“内部存储”中,而不是您在描述中所述的SD卡(也可以从您使用的getExternalStorageDirectory推断出来 - 但是您的问题标题提到了“内部存储”)。因此,请获取正确的路径:
//image paths; 'images' folder was earlier created by getFilesDir
String basePATH = "";
String imagePSPPath = "";
String imagePSP = "passportImage.jpeg"; //can be generated dynamically if needed
File images = new File(getApplicationContext().getFilesDir(), "images");
if(file.exists()) {
    //fine, it exists, build right strings
    basePATH = images.toString();
    imagePSPPath = basePATH +"/"+ imagePSP;
    Log.i("XPATH", imagePSPPath);   //loged for ease of copying
}else {
   //error, path not found
    Toast.makeText(YourActivity.this, "Sorry, path not found: ", Toast.LENGTH_LONG).show();
}

接下来,使用这个路径,但确保它有三个正斜杠,而不是两个。对于我来说,我只是从LOG.i中复制了XPATH地址,并直接将其粘贴到我的Html页面中:
<img src="file:///"+imagePSPPath +" alt="PSP Photo">

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