0

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

1 回答 1

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;
}

感谢这两个帖子:如何使用 WebView loaddata 显示图像?以及如何在 android 中进行 HTTP 身份验证?

于 2013-05-28T08:36:19.917 回答