Как отображать изображение с помощью загрузочных данных WebView?

У меня есть следующие

String urlStr = "http://example.com/my.jpg"
String mimeType = "image/jpeg";
String encoding = null;
String pageData = ""; // This is data read in from an HttpURLConnection
webview.loadDataWithBaseURL(urlStr, pageData, mimeType, encoding, urlStr);

но когда я запускаю это, все, что я вижу, это синий вопросительный знак вместо моего изображения. Каким образом можно обрабатывать отображение изображения в WebView с помощью loadData?

Edit: Есть ли способ сделать это без передачи pageData как <img src="http://example.com/my.jpg/">? Кажется глупым, что loadData принимает тип mime, если он может обрабатывать только "text/html". Тем более, что javadoc перечисляет "image/jpeg" в качестве примера mime-типа, который вы можете передать.

Ответы

Ответ 1

Встраивать исходные коды с кодировкой base64 непосредственно в файл <img> -tag:

  <img src="data:image/jpeg;base64,base64DataHere" />

Вот пример создания <img> -tag (я использую байтовый массив вместо String для raw-data, потому что в моих тестах источник String не работал - я предполагаю, что String не может обрабатывать двоично-данных):

  byte[] imageRaw = yourImage;
  String image64 = Base64.encodeToString(imageRaw, Base64.DEFAULT);
  String pageData = "<img src=\"data:image/jpeg;base64," + image64 + "\" />";

Base64-класс был представлен с API v.2.2 - для более старых версий API вы можете скопировать исходный файл из git и интегрируйте его в свое приложение. Он должен работать со старыми версиями API.

Или вы можете использовать один из альтернативных классов для base64-кодирования, например Base64Coder.


И вот полный рабочий код для извлечения, преобразования и отображения изображения:

  byte[] imageRaw = null;
  try {
     URL url = new URL("http://some.domain.tld/somePicture.jpg");
     HttpURLConnection urlConnection = (HttpURLConnection) url.openConnection();

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

  String image64 = Base64.encodeToString(imageRaw, Base64.DEFAULT);

  String urlStr   = "http://example.com/my.jpg";
  String mimeType = "text/html";
  String encoding = null;
  String pageData = "<img src=\"data:image/jpeg;base64," + image64 + "\" />";

  WebView wv;
  wv = (WebView) findViewById(R.id.webview);
  wv.loadDataWithBaseURL(urlStr, pageData, mimeType, encoding, urlStr);

Ответ 2

    Use this.. solve the problem of images load in webview.

    WebView  webView = (WebView)findViewById(R.id.webView1);
    webView.getSettings().setBuiltInZoomControls(true);
    webView.getSettings().setJavaScriptEnabled(true);

    String url ="Path of image";

    String imgSrcHtml = "<html><img src='" + url + "' /></html>";
    webView.loadData(imgSrcHtml, "text/html", "UTF-8");