android截屏功能实现方式汇总【包括后台截屏】
2023-04-18 14:26:58 时间
前言
对于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
中就能看到效果。
优点:
- 实现简单
- 无权限要求
缺点:
- 只能截应用页面,状态栏不会被截进去,对于全屏截图的需求不适用
- 因为
getWindow()
是Activity中的方法,所以只能在Activity中调用(无法后台截屏)
MediaProjectionManager
MediaProjectionManager
是一个录屏的API,我们可以通过获取其中一帧的方式来得到截图。此方法网上教程很多,大家可以自行搜索。
优点:
没啥优点,只是多了一种截图方案
缺点:
- 代码比较复杂
- 每次截图前会弹窗获取权限,询问是否允许录屏,这对用户体验来说是致命的
- 无法后台截屏,因为需要调用Activity中的
onActivityResult()
方法
使用SurfaceControl.screenshot
SurfaceControl.screenshot
是系统的截屏API,不受Activity的限制,所以可以用来实现后台截图、全屏截图、指定区域截图等功能。
具体使用方式可参考我的这篇文章:SurfaceControl.screenshot()用法
优点:
- 使用无限制,可以在后台使用
- 功能强大,且调用方式简单
- 不用向用户申请权限,同时也无任何弹窗显示
缺点:
- 系统API,必须有系统签名和系统级别权限,普通app用不了此方法
service中创建一个透明的activity,并在activity中调用截图方法
此方法未试验过,不过service确实可以在后台创建一个activity出来,但是限制很多(可参考我的这篇文章:从后台启动activity无效的原因)。同时activity虽然是透明的,但是页面切换的动画效果可能会暴露app的行为,总之并不是一个有效的方法。
修改并编译源码中的screencap类
优点:
优点不大,不建议对系统类进行改造,如果实力允许,使用此方法可以免掉一些绕圈圈的调用方式和系统的限制
缺点:
难度大,需要有源码编译和源码修改的能力
相关文章
- 专家视点:没有监管的AI会产生伦理偏见
- 运营商推出百元内5G套餐:包含20G流量,是真降价还是套路?
- 运营商去年“砸”1757亿元,已建成全球最大规模的5G移动网络
- 5G 商用两年复盘:运营商去年“砸”1757 亿元,已建成全球最大规模的 5G 移动网络
- 从“应用可用”到“服务可达” 博睿数据的DNA创新法则
- 容器技术,带着云原生百米冲刺
- 使用率激增 250%,这份报告再次将 Serverless 推向幕前
- 2021年云应用中的网络安全
- 适度超前推动5G高质量发展
- Techo Hub技术巡回走进长沙,共同探讨数字媒体领域的云端技术创新与实践
- 5G发展正当其时 网络建设应适度超前
- 三大运营商5G手机终端用户达2.85亿户 占移动电话用户的17.8%
- 进击的云原生,为开发者提供更多可能性
- 混合云市场现状与发展趋势研究
- Research and Markets:2027年,全球5G系统集成市场规模将达455亿美元
- 企业网络安全中的AI应用,你知道吗?
- 深信服以新一代云原生负载解决应用发布和负载均衡挑战
- 三大应用策略投资建议 助力企业提升用户体验
- 量子计算竞赛:量子技术将如何以及何时影响行业领域?
- 中国五大移动应用商店携手启动64位安卓生态迁移