[Обратите внимание, что с тех пор, как я ответил на это, onNewPicture устарело (см. http://developer.android.com/reference/android/webkit/WebView.PictureListener.html и Что означает "Этот метод устарел" для разработчиков приложений ). К сожалению, нет информации о том, что его заменяет или на каких уровнях API это поддерживается. Я думаю, это означает, что вы используете это на свой страх и риск.]
Я думаю, вы правы в том, что onNewPicture - это правильное место для захвата скриншота загруженной страницы WeView, но также правильно, что трудно понять, когда на самом деле сделать захват.
Похоже, что WebView вызывает метод NewPicture всякий раз, когда был какой-либо рисунок. Например, он вызывает onNewPicture несколько раз, когда строка поиска находится в режиме ввода с клавиатуры, и курсор щелкает. Аналогичным образом, для некоторых веб-страниц (например, www.yelp.com/nyc) он повторно вызывает метод NewPicture, даже после того, как страница закончила рисовать, возможно, из-за мигающего курсора в поле поиска. Но с другой стороны, он будет вызывать onNewPicture только один раз (например, если пользователь выбрасывает элемент iGoogle).
Так что нет простого правила? Подход, который мы взяли, заключается в том, чтобы
- отслеживать ряд событий, которые влияют на загрузку страницы или влияют на них - например, shouldOverrideUrl, onPageFinished, изменения фокуса, прокрутка начала / конца, в дополнение к onNewPicture
- запустить таймер (2secs работает хорошо) на onNewPicture, сбросить с помощью нового onNewPicture
- реализует загрузочную страницу FSM, которая использует события и истечение времени таймера в качестве входных данных и перемещается через серию переходов между состояниями и действиями, до точки, где она решает, что у нее действительно новая картина.
Не красиво, но это работает, с очень немногими случаями, когда он захватывает одно и то же изображение дважды - и нет случаев, когда ему не удается сделать снимок там, где он должен.