android - 从 WebView 抓取图片

标签 android android-webview

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

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

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

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

我想指出,问题在于找到合适的时间来制作屏幕截图,而不是如何完成。

最佳答案

[请注意,自从我回答这个问题后,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,它使用事件和计时器到期作为输入,并通过一系列状态/ Action 转换,直到它决定它真正拥有一张新图片。

虽然不漂亮,但它确实有效,在极少数情况下它会两次拍摄同一张照片 – 也不会出现未能在应有的位置拍摄照片的情况。

关于android - 从 WebView 抓取图片,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4538429/

相关文章:

java - 我想以编程方式获取 Android 中的应用程序崩溃信息,而不使用第 3 方应用程序或 bugsense 等 jars

java - 增加 Firebase Firestore 中的现有值(value)

android - 如何在两个不同的android应用程序之间进行通信

android - 如何在 Center 中设置 WebView 内容?

API 18 上未添加 JavaScriptInterface

Android expandablelistview展开时无法显示最后一组

android - WebView 无法访问 Assets 中的 jquery 脚本

java - 登录后 Okhttp web 服务 session 丢失

android - 将 ImageView 添加到 Android 中的 ScrollView 时出现冗余边距

android-webview - Android 中 WebView 的默认超时时间是多少?