English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية

Способы реализации захвата экрана WebView в Android

В Hybrid App способ обмена веб-частью становится все более разнообразным, наиболее распространенные способы взаимодействия пользователей включают: копирование ссылки на веб-страницу, прямое выборочное автоматическое делиться в целевом приложении и т.д. Сcreenshot-действие становится все более популярным способом взаимодействия, который нравится пользователям, и мы можем увидеть такую функцию во многих приложениях сообществ. Эта статья总结了 способ реализации захвата экрана WebView в приложениях Android.

WebView как особый виджет, естественно, не может быть использован для получения скриншотов, как другие системные View или способы экранного захвата (чаще всего для захвата длинных изображений). Например:

public static Bitmap getScreenShot(View view){
  View screenView = view.getRootView();
  screenView.setDrawingCacheEnabled(true);
  Bitmap bitmap = Bitmap.createBitmap(screenView.getDrawingCache());
  screenView.setDrawingCacheEnabled(false);
  return bitmap;
}

Если использовать этот код с WebView, то можно получить неполное изображение. На самом деле, система WebView предоставляет соответствующие API для получения объекта Bitmap.

private Bitmap captureWebView(WebView webView){
 Picture picture = webView.capturePicture();
 int width = picture.getWidth();
 int height = picture.getHeight();
 if (width > 0 && height > 0) {
  Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
  Canvas canvas = new Canvas(bitmap);
  picture.draw(canvas);
  return bitmap;
 }
 return null;
}

После получения объекта Bitmap с помощью этого кода можно сохранить его на карту памяти устройства:

private void saveBitmap(Bitmap bitmap){
 File file = new File(Environment.getExternalStorageDirectory(), System.currentTimeMillis() + ".jpg");
 try {
  FileOutputStream fos = new FileOutputStream(file);
  bitmap.compress(CompressFormat.JPEG, 80, fos);
  fos.flush();
  fos.close();
 } catch (java.io.IOException e) {
  e.printStackTrace();
 }
}

Два простых шага, и все готово. Однако, когда вы работаете на устройствах с операционной системой Android 5.0 и выше, вы会发现, что скриншот не отображается полностью. Хотя размер изображения соответствует требованиям, содержимое включает только то, что отображается на текущем экране WebView.

Причина заключается в том, что начиная с Android 5.0, система может智能化地选择 часть Html документа для рендеринга. Поэтому, по умолчанию, мы можем захватить только часть содержимого WebView в области экрана, что и привело к возникновению вышеуказанной проблемы.

Однако, система также предоставляет соответствующие API для изменения этого стандартного оптимизационного поведения. Код очень прост:

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
 WebView.enableSlowWholeDocumentDraw();
}

需要注意的是,这段代码必须添加在 WebView 实例被创建之前。如果使用 Activity 的话,也就是在 setContentView() 方法前面。

Хотя метод capturePicture() уже может получить скриншот WebView, к API 19 этот метод был弃用 системой. Вместо этого используется метод onDraw() для получения объекта Bitmap.

private Bitmap captureWebView(WebView webView){
 float scale = webView.getScale();
 int width = webView.getWidth();
 int height = (int) (webView.getHeight() * scale);
 Bitmap bitmap = Bitmap.createBitmap(width, height, Bitmap.Config.RGB_565);
 Canvas canvas = new Canvas(bitmap);
 webView.draw(canvas);
 return bitmap;
}

Здесь снова нужно отметить, что метод getScale() был удален из системы с API 17. Поэтому еще одним более изящным способом получения значения scale является:

webView.setWebViewClient(new WebViewClient() {
 @Override
 public void onScaleChanged(WebView view,float oldScale, float newScale){
  super.onScaleChanged(view, oldScale, newScale);
  scale = newScale;
 }
});

В заключение, в процессе использования мы также должны учитывать проблему использования памяти Bitmap, выполнять捕获 исключительных ситуаций, чтобы предотвратить возникновение OOM.

Резюме

Как уже было сказано,小编给大家介绍了在Android中使用WebView截图的实现方法,希望对大家有所帮助。Если у вас есть какие-либо вопросы, пожалуйста, оставьте комментарий, и я постараюсь ответить вам как можно скорее. Вновь хочу выразить благодарность всем, кто поддерживает呐喊教程!

Заявление: Контент этой статьи был взят из Интернета, авторские права принадлежат соответствующему автору. Контент был предоставлен пользователями Интернета в порядке самостоятельной подачи, сайт не обладает правами собственности, не был отредактирован вручную и не несет ответственности за связанные с этим юридические последствия. Если вы обнаружите содержимое,涉嫌侵犯版权, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (при отправке письма замените # на @), чтобы сообщить о нарушении и предоставить соответствующие доказательства. При обнаружении факта нарушения мы незамедлительно удалим涉嫌侵权的内容。

Основной учебник
Давай посмотрим!