当我在线时,我想下载图像并将它们缓存在数据库中的base64编码中。当我的应用程序离线时,我会用适当的字符串替换所有图像标记。但如果我展示它们,总会有问号图标,例如在未找到图像时显示。 (LogCat中没有错误或警告)。我怎么能显示图像?
我创建了一个简短的示例应用程序:
@Override
protected void onCreate(Bundle savedInstanceState)
{
activity = this;
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView = (WebView) findViewById(R.id.webview);
webView.setWebViewClient(new MyWebViewClient());
webView.setWebChromeClient(new MyWebChromeClient());
webView.setHttpAuthUsernamePassword(host, "", user, password);
new Image().execute("");
}
public String getUrlContent(String urlstring) throws IOException
{
URL url = new URL(urlstring);
URLConnection connection = url.openConnection();
Authenticator.setDefault(new Authenticator()
{
protected PasswordAuthentication getPasswordAuthentication()
{
return new PasswordAuthentication(user, password .toCharArray());
}
});
HttpURLConnection httpConnection = (HttpURLConnection) connection;
httpConnection.setRequestMethod("GET");
httpConnection.connect();
if (httpConnection.getResponseCode() == HttpURLConnection.HTTP_OK)
{
BufferedReader bufferedReader = new BufferedReader(
new InputStreamReader(httpConnection.getInputStream()));
StringBuilder stringBuilder = new StringBuilder();
String inputLine;
while ((inputLine = bufferedReader.readLine()) != null)
stringBuilder.append(inputLine + "\n");
return stringBuilder.toString();
}
return null;
}
private class Image extends AsyncTask<String, Void, Boolean>
{
private String img;
@Override
protected Boolean doInBackground(String... string)
{
try
{
img = new String(Base64.encodeToString(getUrlContent(url).getBytes(),
Base64.DEFAULT));
} catch (IOException e)
{
e.printStackTrace();
}
return true;
}
@Override
protected void onPostExecute(Boolean doInBackground)
{
String html = "<html><img src=\"data:image/jpeg;base64," + img + "\" /></html>";
webView.loadDataWithBaseURL("http://example.com/my.jpg", html, "text/html", null, url);
webView.loadData(html, "text/html", "UTF-8");
}
}
private class MyWebViewClient extends WebViewClient
{
@Override
public boolean shouldOverrideUrlLoading(WebView view, String url)
{
return true;
}
@Override
public void onReceivedError(WebView view, int errorCode,
String description, String failingUrl)
{
Toast.makeText(activity, "Oh no! " + description, Toast.LENGTH_LONG)
.show();
}
@Override
public void onReceivedHttpAuthRequest(WebView view,
HttpAuthHandler handler, String host, String realm)
{
handler.proceed(user, password);
}
}
private class MyWebChromeClient extends WebChromeClient
{
@Override
public void onProgressChanged(WebView view, int progress)
{
// Activities and WebViews measure progress with different scales.
// The progress meter will automatically disappear when we reach
// 100%
activity.setProgress(progress * 1000);
}
@Override
public void onReachedMaxAppCacheSize(long spaceNeeded,
long totalUsedQuota, WebStorage.QuotaUpdater quotaUpdater)
{
quotaUpdater.updateQuota(spaceNeeded * 2);
}
}
答案 0 :(得分:1)
下载的方法对于图像不正确(我认为您已明确读取字节,而不是图像的字符串)。
这是正确的下载代码:
public String getUrlContent(String urlstring) throws IOException
{
byte[] imageRaw = null;
URL url = new URL(urlstring);
Authenticator.setDefault(new Authenticator(){
protected PasswordAuthentication getPasswordAuthentication() {
return new PasswordAuthentication(user, password.toCharArray());
}});
HttpURLConnection urlConnection = (HttpURLConnection) url
.openConnection();
urlConnection.setUseCaches(false);
urlConnection.connect();
if (urlConnection.getResponseCode() == HttpURLConnection.HTTP_OK)
{
try
{
InputStream in = new BufferedInputStream(
urlConnection.getInputStream());
ByteArrayOutputStream out = new ByteArrayOutputStream();
int c;
while ((c = in.read()) != -1)
{
out.write(c);
}
out.flush();
imageRaw = out.toByteArray();
urlConnection.disconnect();
in.close();
out.close();
} catch (IOException e)
{
// TODO Auto-generated catch block
e.printStackTrace();
}
return Base64.encodeToString(imageRaw, Base64.DEFAULT);
}
return null;
}
感谢这两个帖子:How to display image with WebView loaddata?和How to do HTTP authentication in android?