当我在线时,我想下载图像并将它们缓存在数据库中编码的 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);
}
}