浏览器抓取网页(获取Chrome浏览器分享时的页面的截屏,运行结果)

优采云 发布时间: 2021-12-13 12:19

  浏览器抓取网页(获取Chrome浏览器分享时的页面的截屏,运行结果)

  今天在项目中遇到这样一个需求:在Chrome浏览器分享时获取页面截图。坐下想一想,既然是共享,就必须通过Intent来传递数据。如果真的能拿到Chrome分享页面的截图,那么Intent的数据中肯定有.jpg或.png结尾的数据。直接做,写Demo。

  首先,创建一个新的 BrowserScreenShotActivity.java 并在 AndroidManifest.xml 中注册它。

  接下来,在浏览器中打开一个页面并将其共享给 Demo。这里有问题。我们不知道Intent中截图数据对应的key,怎么办?停下来!

  

  通过断点查看Intent的数据结构,发现Intent中的mMap成员变量收录一个Uri,格式如下:content://com.android.chrome.FileProvider/BlockedFile_332。乍一看,我猜这个Uri是Chrome通过ContentProvider为其他程序提供的虽然和.jpg和.png末尾的数据不一致,但和一开始调用的数据不一致,但不知怎么的发现。

  那么现在还有一个问题,就是mMap.value[3]对应的key值是什么?在上面的断点界面,你根本看不到,但是Android Studio很强大,你却没有发现。由于mMap是一个Map,所以可以长时间通过keySet()方法获取到Map的key。接下来是 Android Studio 大展拳脚的时候了。

  

  如上图,在Debug界面,点击最后一个图标:Evaluate Expression(快捷键:option + f8)。在弹出的对话框中输入如下,回车,你会发现Map的key全部out了:

  

  通过和第一张图对比,发现下标3(share_screenshot_as_stream)的值就是我们需要的key。

  布局比较简单,这里就不贴了,简单截取BrowserSrceenShotActivity.java中的代码:

  

@Override

protected void onResume() {

super.onResume();

if (getIntent() == null) {

return;

}

Uri screenShot = getIntent().getExtras().getParcelable("screen_shot_as_stream");

if (screenShot == null) {

ToastUtil.showDefaultToast("获取浏览器截屏失败~");

return;

}

try {

//授权Uri的读取权限

//若不授权,在 Android 6.0 以上测试崩溃

//https://thinkandroid.wordpress.com/2012/08/07/granting-content-provider-uri-permissions/

//第一个参数为需要授权的apk包名

grantUriPermission("com.littlejie.demo", screenShot, Intent.FLAG_GRANT_READ_URI_PERMISSION);

//通过 Uri 获取截屏图片的输入流

InputStream is = getContentResolver().openInputStream(screenShot);

mIvScreenShot.setImageBitmap(BitmapFactory.decodeStream(is));

} catch (FileNotFoundException e) {

e.printStackTrace();

}

}

  运行结果如下:

  

  Chrome浏览器分享页面截图到此结束。闲来无事,测试了几个浏览器,包括内置浏览器,QQ浏览器,UC浏览器,百度浏览器,火狐浏览器。浏览器差别很大。

  嗯,仅此而已。主要是浏览器支持获取浏览器分享页面截图。适配市面上那么多浏览器,真的很麻烦。这次主要是学习了Android Studio强大的Debug功能。PS:Android Studio 真的是一个非常强大的工具。用好它,事半功倍。唯一的缺点是它消耗了太多的性能。

  演示代码入口:DemoApplication_jb51.rar

  以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持面圈教程。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线