2

感谢stackoverflow,我设法实现了一个webview,我可以通过长按上下文菜单/HitTestResult 保存图像。因此,当我获得图像的 URL 时,我会执行以下操作:

    URL url = new URL(yourImageUrl);
      InputStream is = (InputStream) url.getContent();
      byte[] buffer = new byte[8192];
      int bytesRead;
      ByteArrayOutputStream output = new ByteArrayOutputStream();
      while ((bytesRead = is.read(buffer)) != -1) {
        output.write(buffer, 0, bytesRead);
      }

then put the output.toByteArray() into a FileOutputStream;

对于“普通”站点,这可以正常工作,图像存储在 sdcard 上。

但我仍然不知道(我对此进行了广泛的搜索:-( 如何下载需要某种身份验证的站点图像。例如,我进入站点并将用户名/密码输入表单(一些服务器端语言(如 PHP),这给我带来了一些图片。webview 在登录和显示所有内容方面没有问题。但我无法保存图像,因为身份验证 - 存在于 webview 中 -存在于我的图像保存机制。

使用上面的代码,我只是在 URL.getContent() 上获得了 FileNotFoundException。然后我尝试使用 HttpClient 和 HttpGet/HttpResponse,其中响应总是代码 403。

我的问题:如何访问/下载/验证以获取受保护区域的图像(可能是通过服务器端语言或基本验证)。

我的意思是......它都在那里,正确显示并在 WebView 中进行了身份验证:-( 但是 WebView 的内容和我的 URL/Http 请求下载工作之间没有联系。webview 可以以某种方式共享它的身份验证状态吗?

我什至考虑过从 WebView 缓存中获取图像,因为它就在那里。(但我也不知道如何做到这一点......)。是否没有机制可以以某种方式直接从 WebView 中获取图像?

我会感谢任何形式的帮助!

4

1 回答 1

0

如果身份验证方法使用 cookie,则以下方法可能有效:

首先,在加载 url 之前在 webview 上同步 cookie:

CookieSyncManager cookieSyncManager = 
                    CookieSyncManager.createInstance(webView.getContext());
CookieManager cookieManager = CookieManager.getInstance();
cookieManager.setAcceptCookie(true);
cookieSyncManager.sync();

接下来,在请求您的图像时,您可以将域上的 cookie 放入您的 http 请求标头并从 HttpResponse 获取内容:

String cookies = CookieManager.getInstance().getCookie(yourImageUrl);
HttpClient httpClient    = new DefaultHttpClient();
HttpContext localContext = new BasicHttpContext();
HttpGet httpGet          = new HttpGet(yourImageUrl);
httpGet.setHeader("Cookie", cookies);

HttpResponse httpResponse = httpClient.execute(httpGet, localContext);
HttpEntity httpEntity     = httpResponse.getEntity();
InputStream is            = httpEntity.getContent();
于 2012-09-28T09:10:43.200 回答