2010-11-03 398 views

回答

4

由于您无权访问framebuffer设备,因此您无法从android应用程序执行此操作,除了根目录手机之外。

但是,您可以在开发机器的DDMS窗口中通过adb执行此操作,因为adb在具有framebuffer权限的图形组中运行。

如果您想在根设备上的本地代码中执行类似的操作,请查看adb守护程序的源代码。

编辑:它似乎可能会改变,并且在最近的android版本中可能有非root权能,但我不确定细节。

+0

这是公然不正确。为什么任何人都会赞成这个答案令人眼花缭乱。 – 2011-03-03 05:41:47

+2

@Dedelder这实际上是非常正确的。查看framebuffer设备文件上的组所有权和权限,以及安全设备上没有本地激活的用户代码能够在必要的组中运行的事实。如果你与android架构师谈论此事,那么这是一个非常有目的的用户隐私决定,不让应用程序截图。 – 2011-03-03 15:39:27

+0

但应用程序可以并且确实需要屏幕截图。他们只是不通过屏幕缓冲区。所以,或许这种方法在未来某个时候会被禁用(不太可能),但同时,你的答案实际上有些误导,因为你不提供(明显的)警告,如果目的是简单地对屏幕上的内容进行快照,不需要为此设置固定设备,并且在大多数情况下,它总共包含5行代码。 – 2011-03-03 17:21:09

1

下面是如何将视图转换为位图的示例。只要抓住你的顶级观点,并拥有它。这绝对有效,绝对不需要为此拥有根植设备!

http://www.brighthub.com/mobile/google-android/articles/30676.aspx

+2

这是捕捉视图,而不是屏幕本身。出于某些目的,它可能是足够的并因此有用。但开发人员社区中众所周知,您无法从安全设备上的应用程序中捕获实际的屏幕缓冲区。 – 2011-03-03 15:41:35

+0

我认为就这个问题而言,向他提供关于如何获取父视图(针对所有意图和目的是屏幕缓冲区)的建议就足够了。所以,你在技术上是正确的,但我认为他根本不会完美地表达他的问题。他想要什么(我认为)只是简单地对屏幕上显示的任何内容进行位图屏幕抓取,这既不重要,也不需要root权限。 – 2011-03-03 17:17:00

+5

我的怀疑是他想要捕获另一个应用程序的屏幕。如果是他自己的应用程序,使用内置于DDMS中的屏幕截图速度最快 - 无需编写单行代码。如果他需要发布具有内置功能的应用程序以在用户设备上捕获其自己UI的本质,那么您的建议将非常有用。 – 2011-03-03 17:48:58

0

尝试这样的事:

View v1=childView.getRootView(); 
v1.setDrawingCacheEnabled(true); 
Bitmap bm=v1.getDrawingCache(); 
if(bm!=null){ 
    //save the file 
}