android截屏功能实现方式汇总【包括后台截屏】

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6

前言

对于android实现截屏功能简单讲述一下可行的方法和之间的利弊



使用canvas

View v = getWindow().getDecorView();
Bitmap bitmap = Bitmap.createBitmap(v.getWidth(), v.getHeight(), Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas();
canvas.setBitmap(bitmap);
v.draw(canvas);

ImageView image = findViewById(R.id.image);
image.setImageBitmap(bitmap);

以上就是最简单的一种形式通过画布将当前页面变成bitmap然后直接加载到ImageView中就能看到效果。
优点

  1. 实现简单
  2. 无权限要求

缺点

  1. 只能截应用页面状态栏不会被截进去对于全屏截图的需求不适用
  2. 因为getWindow()是Activity中的方法所以只能在Activity中调用无法后台截屏


MediaProjectionManager

MediaProjectionManager是一个录屏的API我们可以通过获取其中一帧的方式来得到截图。此方法网上教程很多大家可以自行搜索。
优点
没啥优点只是多了一种截图方案

缺点

  1. 代码比较复杂
  2. 每次截图前会弹窗获取权限询问是否允许录屏这对用户体验来说是致命的
  3. 无法后台截屏因为需要调用Activity中的onActivityResult()方法


使用SurfaceControl.screenshot

SurfaceControl.screenshot是系统的截屏API不受Activity的限制所以可以用来实现后台截图、全屏截图、指定区域截图等功能。
具体使用方式可参考我的这篇文章SurfaceControl.screenshot()用法
优点

  1. 使用无限制可以在后台使用
  2. 功能强大且调用方式简单
  3. 不用向用户申请权限同时也无任何弹窗显示

缺点

  1. 系统API必须有系统签名和系统级别权限普通app用不了此方法


service中创建一个透明的activity并在activity中调用截图方法

此方法未试验过不过service确实可以在后台创建一个activity出来但是限制很多可参考我的这篇文章从后台启动activity无效的原因。同时activity虽然是透明的但是页面切换的动画效果可能会暴露app的行为总之并不是一个有效的方法。



修改并编译源码中的screencap类

优点
优点不大不建议对系统类进行改造如果实力允许使用此方法可以免掉一些绕圈圈的调用方式和系统的限制

缺点
难度大需要有源码编译和源码修改的能力

阿里云国内75折 回扣 微信号:monov8
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6
标签: android