2012-09-27 29 views

回答

7

您应该能够运行在Java代码中的命令:

Runtime.getRuntime().exec("screencap -p /sdcard/screen.png"); 

有一些shell命令,你可以无需根用户身份执行。所以你不需要运行“su”。我不确定你是否可以执行screencap。当然,您需要获得在您的应用中写入SD_CARD的权限。

android.permission.WRITE_EXTERNAL_STORAGE 

但是为什么你不使用Android API来制作截图?欲了解更多信息,请阅读这篇文章的计算器:How to programmatically take a screenshot in Android?

Androids安全模型基于用户id,就像Linux一样。每个应用都有自己的用户ID。所以你的应用程序有一个像1001这样的用户标识。如果你的用户被允许运行你的命令,否则你会收到一个错误。

编辑:
你需要root用户截屏或成为系统应用程序。有权限READ_FRAME_BUFFER,但只有当您是系统应用程序时才可以获得该权限。当应用可以截取设备的屏幕截图时,它是一个安全问题。

我发现这个API http://code.google.com/p/android-screenshot-library/它承诺不带根目录的截图。我没有测试它。图书馆启动一个本地服务,然后为您截取屏幕截图。 但是您必须在每次手机启动时运行该服务。所以它获得了系统权限。这不是很舒服......

结论:采取屏幕快照,无需从代码根本没有很好的办法......

+0

AFAIK,没有API来捕捉截图。所以,我尝试通过shell命令执行screencap。但是我无法在没有root权限的情况下执行它。 –

+0

似乎是这样。没有API,你需要root来运行screencap。 我发现这个库http://code.google.com/p/android-screenshot-library/与此,你应该能够没有根用户截图。它安装一个本地服务,通过adb shell启动。所以它有能力截图。 – mcia

+0

我曾尝试过。它不适用于android 3.x和android 4.x,因为framebuffer在那里被破坏了。现在可以接受的方式是通过shell命令调用screencap(在root权限下) –

2

Is there any way to run android system app without root permission?

它必须NO,但有些时候,一些功能,这不可公开使用可用。我见过使用java反射的例子。我想,不。

的事情是亚行外壳用户应用有基于用户和不同的安全级别组ID(UID和GID)。

更多信息:http://android-dls.com/wiki/index.php?title=Android_UIDs_and_GIDs

此外,还有通过应用权限隐伏&内部类,程序,等它内部使用作出限制。

产品号:关于截图。在Android市场(谷歌播放)有几个应用程序提供没有ROOT访问的屏幕截图。所以,这是可能的。 尽管Android 4.0的屏幕截图可以从“框中”获得。

+0

请注意详细说明哪些应用可以做到这一点?我们可以反编译它们并找出它是如何工作的。 –

相关问题