如何在不使用root权限的情况下,从应用程序中捕获其他Android应用程序的屏幕截图?

4

我想截取正在手机上运行的Android应用程序的屏幕截图。

我尝试使用ScreenShot UX应用程序。这可以在未经root的手机上完成。 有没有办法从在后台运行的服务中获取Android应用程序的屏幕截图呢?

我希望我的服务定期截取屏幕并发送到服务器。


1
同时按下锁定/电源键和主页/返回键 - rajpara
我需要实现它的代码。 - Abi
1
那篇文章介绍了如何从应用程序本身创建视图的快照。我想从一个服务中获取屏幕截图,而不受应用程序的影响。 - Abi
将整个线性布局放入绘图缓存中,然后将视图绘制到画布上并保存为位图,但您必须启用该视图的绘图缓存(view.setDrawingCacheEnabled(true))。 - mayank_droid
@mak_just4anything 这只能在同一个活动中完成。我想从我的服务中截取另一个应用程序的屏幕截图。 - Abi
显示剩余2条评论
3个回答

12

如果要截取一个不属于你自己应用的应用程序的屏幕截图,唯一的方法是获取原始帧缓存。帧缓存通常位于 /dev/fb0/dev/graphics/fb0。在某些设备(如 LG Optimus One)上,可以在未获得 root 权限的情况下访问该帧缓存,但在大多数设备(如 Nexus S)上需要获取 root 权限。出于安全考虑,通常不允许这样做,因为恶意应用程序可能会在后台截屏并将其发送到远程服务器,揭示诸如电子邮件 ID 和密码以及在某些情况下银行账户信息等敏感信息。


从服务中截屏是否合法?我想用它进行移动跟踪,而不是用于任何恶意应用程序。 - Abi
1
您可以使用服务调用应用程序中的方法来截取自己应用程序的屏幕截图,但是在不使用帧缓冲区的情况下无法与其他应用程序一起使用。尽管您可能有合法的用途,但许多应用程序可能会滥用它,因此在非root设备上基本上不可用。 - Raghav Sood
+1 这太棒了,谢谢。我注意到在我的新 Nexus 设备 4.4.4+ 上,缓冲区都不在这些位置中 - 有任何想法它可能已经移动到哪里了吗? - Dori

9
请查看Android截屏库,它可以在不需要root权限的情况下,通过编程方式捕获Android设备的截屏。

我能否在没有桌面应用程序的情况下运行该程序?在ScreenshotService.java文件中,有一个名为retreiveRawScreenshot()的方法。它正在连接到本地应用程序。那个本地应用程序是否在PC上运行?http://code.google.com/p/android-screenshot-library/source/browse/demo/src/pl/polidea/asl/ScreenshotService.java - Abi
据我所知,如果您想截取当前设备屏幕(任何应用程序)的截图(我想这就是您要找的),那么您需要拥有root权限。 - COD3BOY
2
屏幕截图 UX 也适用于未 root 的手机,但仅限于部分机型。 - Abi
这个库真的只用于测试/调试目的吗?我无法想象在生产环境中使用此应用程序所需的前提条件来捕获屏幕。 - Coova
@Abi,你得到答案了吗?因为我也有同样的问题 :/ - mazhar
显示剩余4条评论

8

从 Android 5.0+ 开始,您可以使用 SDK 中的新功能——媒体投影(media projections)来进行屏幕截图而无需 root 权限。Google 提供了一个可用的示例代码,点此查看。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接