Android WebView获取网页已加载图片数据(Java端不发起二次请求)
Android WebView获取已加载图片实际数据(非URL)的方案探讨
核心需求:在Android WebView中获取网页已加载图片的实际数据,禁止从Java端发起二次请求,所有请求必须由网页端发起。优先实现无用户交互的方案,若无法实现,可接受需要用户交互的方案。
已尝试的思路及问题
1. 实现带图片选项的上下文菜单
参考Chrome的长按图片>「复制图片」逻辑,目前仅能通过HitTestResult获取图片URL,无法直接拿到图片数据。测试发现Chrome执行该操作时不会对图片URL发起二次请求,说明此方案可行,但暂未找到获取图片数据的实现方式。该方案需要用户交互,虽非最优但可接受。
实现代码如下:
@Override public void onCreateContextMenu(ContextMenu contextMenu, View view, ContextMenu.ContextMenuInfo contextMenuInfo){ super.onCreateContextMenu(contextMenu, view, contextMenuInfo); final WebView.HitTestResult webViewHitTestResult = webView.getHitTestResult(); if (webViewHitTestResult.getType() == WebView.HitTestResult.IMAGE_TYPE || webViewHitTestResult.getType() == WebView.HitTestResult.SRC_IMAGE_ANCHOR_TYPE) { contextMenu.setHeaderTitle("Image options"); contextMenu.add(0, 1, 0, "Get image") .setOnMenuItemClickListener(new MenuItem.OnMenuItemClickListener() { @Override public boolean onMenuItemClick(MenuItem menuItem) { // 此处需要获取图片数据,而非URL String DownloadImageURL = webViewHitTestResult.getExtra(); return false; } }); } }
2. 注入JavaScript通过Canvas获取图片数据
思路是将网页已加载的图片绘制到Canvas中,再从Canvas提取图片数据(网页端自身发起的二次请求是允许的)。但实际执行时因**污染画布(tainted canvas)**报错无法完成,由于无法修改图片CDN的跨域权限,此方案不可行。
3. 直接访问WebView缓存中的图片
这是最理想的方案,但暂不清楚可行性及具体实现方式。疑问点:网页加载的图片是否可直接访问其缓存?如何通过已知的图片URL匹配到对应的缓存文件?再次强调:禁止通过Java端请求图片并写入缓存,所有图片请求必须由网页端发起。
内容的提问来源于stack exchange,提问作者user984003
相关产品推荐
相关产品推荐

