如何在没有root权限的情况下以编程方式对其他应用程序进行截图,比如截图UX试用?
>
我知道我可以在我的应用程序中捕获根视图的位图。但是当我的应用程序在后台运行时,我无法获得其他应用程序的根视图
bitmap=bitmap.createBitmap(rootview.getdrawingcache());
清单中有一个捕获当前帧缓冲区的权限:Android.permission.read_frame_buffer
。但是一些网站说它只适用于签名应用程序。
检查Android权限-保护级别
在尝试截图UX试用后,我阅读了权限:
似乎system_alert_window
或get_tasks
允许应用程序截图。我对它的工作原理有两个猜测:
活动
,它获取活动
的根视图,捕获其截图。GlreadPixels
如果你尝试我的一个猜测,请让我知道结果。
这是极其困难的。我花了好几年的时间想做这件事。我最终成功了,但任何解决方案都将涉及商业和技术努力。
下面的大部分内容不再是最新的。经过这么多年,现在有了一个android.media.projection
包https://developer.android.com/reference/android/media/projection/package-summary.html,它终于可以满足您的需要了!
为了完整起见,我希望包含您自己的注释,即您可以使用bitmap.createbitmap(rootview.getdrawingcache());
和类似的机制捕获您自己的应用程序的映像。
我觉得这有点可悲,所以早在2009年,我就提交了一个Android开源项目,要求开放它1。Android架构师黛安娜·哈克伯恩的回应是:
嗯,没有。绝对不是。
所以,那很顺利!因此,该权限至今仍是签名
级别。
但是,如果您有此权限,您可以调用ISurfaceComposer
2的CapturesCreen
成员。您需要编写一些本地代码来访问这个函数,使用Android NDK和一些未记录的API。然而,这是可能的。
在Android graphics子系统内部,它使用GlreadPixels
调用将像素从GPU检索回CPU。(GPU用于Android上的大部分合成。事实上,Android4.0+支持额外的硬件合成程序,而Surface Flinger需要做更多的工作才能将这些像素拉回CPU。)
这个调用运行得很好,除了几个小问题:
...还有一个大问题...
有些人试图读取这些表示framebuffer的Linux设备文件。但是,存在三个问题:
capturescreen
API来获得正确的图像。现在我们进入需要商业行动的解决方案。
与Android芯片组制造商交谈通常会给出一个解决方案。因为他们设计了硬件,所以他们可以访问framebuffer,而且他们通常能够提供完全避免Android权限模型的库,只需直接访问他们的自定义内核驱动程序。
如果你的目标是一个特定的手机型号,这往往是一个很好的方式前进。当然,很可能你需要和手机制造商以及硅制造商合作。
有时这可以提供出色的结果。例如,我听说在某些硬件上可以将手机硬件framebuffer直接管道到手机硬件H.264视频编码器中,并检索手机屏幕上的任何预先编码的视频流。杰出。(不幸的是,我只知道这在TI OMAP芯片上是可能的,这些芯片正逐渐退出手机市场3)。
Android严格执行其权限模型,并且几乎没有安全漏洞。然而,Android原始设备制造商有时会更加粗心。
例如,一个名字以S开头的主要OEM已经实现了一种使用击键捕获屏幕的方法。它将其保存到SD卡上的一个世界可读的文件中。假设您可能能够找到拦截这些密钥的东西,并了解它是如何工作的。也许你可以做类似的事情。
也许还有另一个名字也以S开头的主要OEM公司的方法。
不,我不打算在这部分做更多的细节。为了弄清楚如何做这些事情,我需要有反向工程软件,而这可能是非法的。不过祝你好运。
如前所述,手机制造商可以随时访问一个有效的API。并且电话制造商具有所需的签名
级权限。
所以,你所需要做的就是安排让手机制造商签署你的软件。
然而,这很难。通过签署软件,手机制造商保证了它的质量--所以他们应该想审核你的源代码。此外,由于Android的性质--如果他们签署了软件,他们需要是分发软件的人。如果是别人的签名,你就不能把它放在市场上。
然而,OEM不需要在ROM中包含它--他们仍然可以在Android市场上分发它。但你不能。
一个好的解决方案是,每个供应商签署一个小型库,然后可以通过公共SDK访问该库。这让我想到...
我对此了解很多,因为我曾经在RealVNC工作过。我们与所有主要的Android手机供应商合作,以获得这些签名级API。我怎么强调都不为过,为了实现这一目标,需要付出许多、许多人多年的努力(商业和技术上)。一些原始设备制造商已经公布了这项工作-例如4。
我不再在RealVNC工作了,所以我没有从他们的软件广告中获得任何好处。但是如果你真的真的想在多个Android设备上捕捉屏幕,你可能希望与他们联系,重新使用他们的远程控制服务或Android VNC SDK5。它不是开源的,所以你应该付费,相信我,考虑到与所有这些Android OEM合作的史诗般的努力,这是足够公平的。
为了平衡起见,我应该指出,其他供应商也在这方面与手机制造商合作--例如SOTI。但我相信它们都提供特定的设备管理解决方案,而不是一般的远程控制/事件注入SDK。
另一个选项--adb
守护进程监听通过USB调试连接的权限比普通应用程序略多,这就是为什么它能够抓取屏幕(您可以使用ddms
工具查看它的图像)。如果您能够使用adb
运行任何命令,那么您也可以获得这些特权(根据前面链接的android-screenshot-library)。
最终,这个问题让我灰飞烟灭,我离开了更绿色的牧场,不需要试图从Android手机中挤出像素。
然而,在我离开RealVNC之前,我们再次尝试将这些API贡献给Android开源项目。这次我们得到了一个更积极的反应。简而言之,有人认为我们的安全方法几乎是正确的,但图形系统太混乱了,无法接受我们的补丁。好吧,好消息是图形系统不再混乱--事实上,它现在有了capturescreen
API,这意味着不需要任何图形系统更改。因此,可以围绕这个API向AOSP提交一个新的安全机制,最终解决了这个问题。
祝你好运!
TeamViewer允许远程控制其他android设备。它相当慢,但它完成了工作。 它需要安装2个应用程序。一个控制(链接在这里),一个被控制(链接在这里)。 我不确定它是否有任何替代方案,但我想知道是否有可能这样做。 我找不到teamViewer使用的任何特殊权限,它在没有root的情况下完成了这一切。 这很奇怪,因为我在很多地方读到过,为了让一个应用程序进行截图,它必须有root权限(或者连接
我想捕捉一个在我的手机上运行的Android应用程序的屏幕截图。 我尝试使用屏幕截图UX应用程序。这也可以在无根电话上完成。你知道如何从后台运行的服务中获取Android应用程序的屏幕截图吗? 我希望我的服务定期捕捉屏幕,并发送到服务器。
问题内容: 是否可以使用Swift 3以编程方式为Mac上的桌面拍摄屏幕截图?我找不到关于该主题的单个主题或论坛帖子,甚至在Apple的官方文档中也找不到。 问题答案: 是的,它有可能。此功能获取所有连接的监视器的屏幕截图,并将其作为jpg文件写入指定的路径。生成文件名作为Unix时间戳。
安装了jpackage应用程序后,我如何允许用户升级应用程序,而不需要再次运行安装程序?我有哪些选项允许用户升级? 理想的情况是,底层JAR将在运行时被调出,应用程序将在同一进程中重新启动。我想这可能是不可能的?
据我所知,有几种android杀毒软件,例如: 平均移动电话 AVAST软件 McAfee(英特尔安全) 诺顿移动电话 卡巴斯基Lаb 等 每一个都提供了扫描已安装的android应用程序的功能,以查找病毒等(即使是没有根目录的android设备)。 证明上述的截图如下: 但据我所知,安装在无根Android设备上的应用程序,一个应用程序无法访问另一个已安装的应用程序及其相关文件,例如: > 预安