Захват изображения из WebView

Можно ли прослушивать полную загрузку страницы WebView, а затем снимать снимок экрана с загруженной страницы?

Я пробовал два пути, но оба они не работают:

  • используя WebViewClient и onPageFinished(WebView view, String url).
    Он не работает (и он описан в документах), потому что картинка может быть не готова к этому моменту

  • используя WebView.PictureListener и onNewPicture(WebView view, Picture picture)
    Он также не решает проблему, потому что этот метод вызывает неопределенное время. В первый раз изображение часто содержит только часть содержимого страницы. И я не знаю, как определить, что текущий вызов является последним для страницы.

Я хочу заметить, что проблема заключается в том, чтобы найти правильный момент, чтобы сделать снимок экрана, а не как это можно сделать.

Ответ 1

[Обратите внимание, что, поскольку я ответил на это, onNewPicture устарел (см. http://developer.android.com/reference/android/webkit/WebView.PictureListener.html и Что такое "Этот метод устарел" означает для разработчиков приложений). К сожалению, нет информации о том, что его заменяет, или о том, какие уровни API поддерживаются. Я предполагаю, что это означает, что вы используете это на свой страх и риск.]

Я думаю, что вы правильно поняли, что onNewPicture - это подходящее место для захвата скриншота загруженной страницы WeView, но также правильно, что трудно понять, когда делать захват.

Похоже, что WebView вызывает onNewPicture всякий раз, когда был какой-либо чертеж. Например, он многократно вызываетNewPicture, когда панель поиска находится в режиме ввода клавиатуры и курсор перемещается. Аналогичным образом, для некоторых веб-страниц (например, www.yelp.com/nyc) он повторно вызываетNewPicture, даже после того, как страница закончила рисование, вероятно, из-за мигающего курсора в поле поиска. Но с другой стороны он будет вызывать onNewPicture только один раз (например, если пользователь опустил элемент iGoogle).

Значит, нет простого правила? Подход к

  • отслеживать ряд событий, которые связаны/влияют на загрузку страницы - например, shouldOverrideUrl, onPageFinished, изменения фокуса, прокрутка начала/конца, в дополнение к onNewPicture
  • запустить таймер (2 сек. работает хорошо) на onNewPicture, reset с помощью нового onNewPicture
  • реализует загрузку страницы FSM, которая использует события и таймер в качестве входных данных, и перемещается по серии переходов состояния/действия, до того момента, когда она решит, что она действительно имеет новое изображение.

Не очень, но он работает, причем очень мало случаев, когда он захватывает одну и ту же картинку дважды - и нет случаев, когда он не может захватить изображение, где он должен.