【问题标题】:Capture picture from WebView从 WebView 捕获图片
【发布时间】:2010-12-27 11:45:30
【问题描述】:

是否可以监听 WebView 页面加载完成,然后捕获加载页面的屏幕截图?

我尝试了两种方法,但它们都不起作用:

  • 使用WebViewClientonPageFinished(WebView view, String url)
    它不起作用(并且它在文档中进行了描述),因为此时图片可能还没有准备好

  • 使用WebView.PictureListeneronNewPicture(WebView view, Picture picture)
    它也没有解决问题,因为这个方法调用了不确定的时间。最初,图片往往只包含部分页面内容。而且我不知道如何确定当前调用是该页面的最后一次调用。

我要注意,问题是要找到合适的时间来制作截图,而不是如何完成。

【问题讨论】:

标签: android android-webview


【解决方案1】:

[请注意,自从我回答这个问题后,onNewPicture 已被弃用(请参阅http://developer.android.com/reference/android/webkit/WebView.PictureListener.htmlWhat does "This method is deprecated" mean for application developers)。不幸的是,没有关于替换它的信息或支持它的 API 级别的信息。我想这意味着您使用它需要您自担风险。]

我认为你是正确的 onNewPicture 是捕获加载的 WeView 页面的屏幕截图的正确位置,但也正确的是很难知道何时实际进行捕获。

似乎只要有任何绘图,WebView 就会调用 onNewPicture。例如,当搜索栏处于键盘输入模式并且光标在滑动时,它会重复调用 onNewPicture。类似地,对于某些网页(例如 www.yelp.com/nyc),它会反复调用 onNewPicture,即使在页面完成绘制之后也是如此,这可能是因为“搜索”框中的光标闪烁。但在另一个极端情况下,它只会调用一次 onNewPicture(例如,如果用户下拉了 iGoogle 项目)。

所以没有简单的规则?我们采取的方法是

  • 监控涉及/影响页面加载的一系列事件 - 例如 shouldOverrideUrl、onPageFinished、焦点更改、滚动开始/结束以及 onNewPicture
  • 在 onNewPicture 上运行一个计时器(2 秒运行良好),由新的 onNewPicture 重置
  • 实现一个页面加载 FSM,它使用事件和计时器到期作为输入,并通过一系列状态/动作转换,直到它决定它真正拥有一张新图片。

不漂亮,但它确实有效,它很少会两次捕获同一张图片 - 并且没有任何情况下它无法捕获应该捕获的图片。

【讨论】:

  • 对不起。 FSM 是有限状态机 - 请参阅 en.wikipedia.org/wiki/Finite-state_machine
  • 那篇文章中还提到了 SourceForge 资源。这个想法是您设置自己的 FSM 来处理页面加载 - 输入是事件,如对 onNewPicture 的调用或超时到期 - 状态取决于您想要的行为,但可能是“初始化”之类的东西, “等待 onNewPicture 等 - 对于每个输入/状态组合,实现要么移动到新状态,要么采取一些行动 - 最终行动是进行捕获。
  • @Torid onNewPicture 现在是 deprecated。你能相应地更新你的答案吗?对 FSM 逻辑进行了一些阐述? (代码或伪代码将是超级的)。 +1。
  • 鉴于显然没有替代 onNewPicture 的方法,很难想象有什么替代方法。我已经更新了上面的答案,提到它已被弃用并指向 an00b 的帖子。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-09-01
  • 2016-08-29
  • 2019-05-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多