【问题标题】:is it possible to invoke ICS screen shot function from adb?是否可以从 adb 调用 ICS 屏幕截图功能?
【发布时间】:2012-03-20 02:03:07
【问题描述】:

我需要能够进行屏幕转储以进行测试,而 ICS 现在有一个屏幕截图功能,可以通过按下(并按住)降低音量和电源按钮来调用它。 有没有办法通过 adb 编写这个函数的脚本? (据我了解,它没有公共的 Java API)。我尝试使用 java 中的 KeyEvent 来模拟电源和音量按钮,并且我尝试使用 adb keyevent 和 adb sendevent 没有成功。我怀疑电源按钮也会产生一些上述方法没有产生的低级调用。

那么有谁知道是否可以从 adb 调用该函数? 如果这不可能,有人知道这个屏幕截图功能在源代码中的哪里存在吗?也许我可以通过阅读找到一些东西。

更新

用于捕获屏幕的源代码位于“frameworks/base/services/surfaceflinger/services/surfaceflinger/SurfaceFlinger.cpp”中的一个名为 screenCapture 的函数中。我不知道是否可以从jni调用它,但我会尝试,因为如果我可以通过java截屏会很棒。

否则,@edthethird 通过 android.amberfog.com/?p=168 提供了一个解决方案,可以使用命令行截屏。

感谢大家的帮助!

【问题讨论】:

    标签: android screenshot adb android-4.0-ice-cream-sandwich


    【解决方案1】:

    以 adb 命令的形式,在 ICS 设备上工作:

    adb shell /system/bin/screencap -p /sdcard/img.png
    adb pull /sdcard/img.png img.png
    

    见:http://a-more-common-hades.blogspot.com/2012/01/screenshot-command.html

    【讨论】:

      【解决方案2】:

      这与 ICS 无关,但在 Eclipse 中,请查看 Devices 选项卡。最右边有一个小小的相机图标。 (从右到左依次为“方框”、“线”、“倒三角形”、“摄像头”。点击此摄像头即可截取当前选中的设备。

      这适用于任何版本的 Android,不仅仅是 ICS。

      【讨论】:

      • 如果eclipse可以做到这一点,那么一定有某种方法可以通过adb实现。
      • @danp 如果有办法自动完成,那就太好了。我不知道如何使用 ddms 自动执行此操作。
      • @edthethird 如果我找不到使用屏幕截图功能的方法,这可能是一个解决方案,谢谢!我会更多地研究它。
      【解决方案3】:

      看到这个问题: Screenshot of the Nexus One from adb?

      基本上,您可以使用 adb 拉取帧缓冲区并自己将其转换为可用的图像,或者您可以只使用 Google 提供的命令行实用程序。环顾四周,我认为您可能需要稍微调整该实用程序才能使其在较新版本的 Android 上运行。

      正如另一个答案指出的那样,除非您尝试自动化测试,否则从 Eclipse 中执行此操作可能会更轻松。

      【讨论】:

      • 是的,不幸的是我正在开发图形的自动测试,所以我必须能够编写脚本。我们使用了您之前描述的方法,但是我们的新硬件不支持它,我必须找到一种新的方法。
      • 我一直在尝试从应用程序中执行此操作,但无济于事。请帮忙?
      【解决方案4】:

      查看源代码后,有一个库完全符合我的要求。 框架\基础\cmds\screencap\screencap.cpp 该程序可以通过 /system/bin/screencap 在 android 上执行。 所以可以通过Runtime.getRuntime().exec()在android上用Java执行;

      一个缺点是你需要一个特殊的证书才能截图。

      【讨论】:

      • 你能解释一下吗?什么特殊证书?如果我尝试: Process process = Runtime.getRuntime().exec("/system/bin/screencap");什么都没有发生。
      • 如果我尝试这样做: Process process = Runtime.getRuntime().exec("/system/bin/screencap -h");并在进程的输入流上设置一个 BufferedReader,没有任何返回。
      • 如果您检查 logcat,您可能会收到一条错误消息:“ W/PackageManager(1862): Not granting permission android.permission.READ_FRAME_BUFFER to package com.xxx.xxx (protectionLevel=3 flags= 0x8be46)
      • 仅添加 READ_FRAME_BUFFER 是不够的,要使用屏幕截图,您需要使用允许您使用帧缓冲区的特殊证书对您的应用程序进行签名。我不确定我们的证书是从哪里获得的,是从谷歌还是从我们的图形程序员那里获得的。但我很确定您无法在 google Play 上发布具有此证书的应用
      猜你喜欢
      • 2014-04-13
      • 1970-01-01
      • 2018-04-21
      • 1970-01-01
      • 1970-01-01
      • 2011-02-07
      • 1970-01-01
      • 1970-01-01
      • 2023-03-31
      相关资源
      最近更新 更多