2

stackoverflowのおかげで、ロングクリックのコンテキストメニュー/HitTestResultを介して画像を保存できるWebビューを実装することができました。したがって、画像の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;

「通常の」サイトの場合、これは正常に機能し、画像はSDカードに保存されます。

しかし、私はまだわかりません(そして私はこれを徹底的に検索しました:-(ある種の認証を必要とするサイトの画像をダウンロードする方法。たとえば、サイトを入力してユーザー名/パスワードをフォームに入力します( PHPのようなサーバー側の言語)を使用すると、いくつかの写真が表示されます。Webビューは、ログインしてすべてを表示するのに問題はありませんが、Webビューに存在する認証がに存在しないため、画像を保存できません私の画像保存メカニズム。

上記のコードを使用すると、URL.getContent()でFileNotFoundExceptionが発生します。次に、HttpClientとHttpGet / HttpResponseを使用しようとしました。ここで、応答は常にコード403です。

私の質問:保護された領域の画像を取得するためにアクセス/ダウンロード/認証するにはどうすればよいですか(サーバー側の言語または基本認証を使用する場合があります)。

つまり...すべてがそこにあり、正しく表示され、WebViewで認証されます:-(しかし、WebViewのコンテンツとURL / Httpリクエストのダウンロード作業との間に関係はありません。WebViewは何らかの方法で認証状態を共有できますか?

WebViewキャッシュから画像をフェッチすることも考えました。すべてがそこにあるからです。(しかし、私もこれを行う方法を見つけることができませんでした...)。どういうわけかWebViewから直接画像を取得するメカニズムはありませんか?

どんな助けにも感謝します!

4

1 に答える 1

0

認証方法が Cookie を使用している場合、以下の方法が機能する可能性があります。

まず、URL をロードする前に Web ビューで 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 に答える