Android如何截取屏幕截图?

时间:2012-11-01 15:44:45

标签: android screenshot

我知道如何截取屏幕截图,但我想知道它是如何工作的。

至少从Android 4.0开始,您可以通过按住手机上的音量减小+电源键来拍摄屏幕截图,Android将捕获当前屏幕并将其保存到SD卡。

我只是想知道是否有人知道这是如何工作的,例如,如果它是在后台持续运行的服务,或者每个应用程序内置的东西,或者。此外,它位于Android的源代码中的哪个位置?

谢谢!

4 个答案:

答案 0 :(得分:9)

浏览sourcecode我找到了侦听组合键的部分并启动了该过程:

以下是具体代码:

http://androidxref.com/4.1.1/xref/frameworks/base/policy/src/com/android/internal/policy/impl/PhoneWindowManager.java#3270

答案 1 :(得分:6)

如果您只想拍摄非常直接的截屏:

public Bitmap screenShot(View view) {
    Bitmap bitmap = Bitmap.createBitmap(view.getWidth(),
            view.getHeight(), Config.ARGB_8888);
    Canvas canvas = new Canvas(bitmap);
    view.draw(canvas);
    return bitmap;
}

只需使用您想要快照的视图调用此方法..所以,如果您希望整个屏幕只传递到最顶层的ViewGroup。如果你想要系统控件也只需要调用:

screenShot((ViewGroup) view.getParent());

现在,如果您想知道“音量降低+电源键”的工作原理是如何在操作系统中更深入,而不是您也可以访问。无法拦截APK AFAIK的电源按钮。

答案 2 :(得分:6)

我刚刚在源代码树中找到了代码:https://github.com/android/platform_frameworks_base/tree/master/packages/SystemUI/src/com/android/systemui/screenshot

我想这只是通过阅读来更好地理解这个过程的问题。

答案 3 :(得分:1)

Android应用程序使用意图来调用系统级资源。例如,运行摄像机的大多数软件都是由操作系统提供的。 Android操作系统基于unix / linux内核,所以使用相机会是这样的。

  1. 应用程序/进程决定要使用相机。
  2. 该应用程序/进程构建一个intent并将其传递给操作系统。
  3. 意图由OS处理,并且在新进程中执行(exec)相机软件。如果调用同步调用intent,调用进程可以阻塞它,也可以异步运行,调用应用程序和intent调用应用程序可以同时运行。在相机的示例中,它可能会被同步调用并阻塞。
  4. 用户使用相机处理来拍照。
  5. 摄像机进程退出并生成错误或图片。
  6. 操作系统执行一些ipc(进程间通信)以将图片传递回调用进程。根据应用程序调用的意图类型,选择使用管道或消息传递留给操作系统。摄像机可能会使用消息传递,因为父进程在子进程运行时被阻止。
  7. 现在,操作系统唤醒了调用进程,该进程阻止等待返回的意图,并返回到运行状态。
  8. 图片已返回到调用应用程序,供其按需使用。
  9. 当您拍摄屏幕截图时,这正是发生的事情。有一个进程正在运行以处理用户界面。它基本上位于等待输入和过滤器,用于操作系统在传送到当前运行的应用程序之前应解释的任何内容。这是另一个unix约定,在这一点上,我能想到的每个操作系统都是标准的 - 管道输入流。它允许操作系统在传递给应用程序之前捕获更高优先级的输入,例如OS控制命令。 (想想在windows中使用ctrl-alt-delete,或在unix中使用ctrl-c / ctrl-z。)当按下屏幕截图键时,这个上游io进程会执行一个特殊程序来拍摄屏幕截图(通过意图)和命令永远不会传递给'running'应用程序。该程序在一个新进程中执行(exec),构建一个屏幕位图,将其保存到图库空间,然后死掉 - 所有这些都与处理时间共享的调度程序异步,因此手机始终感觉“响应”。您可以在John Bokers中看到所有gorp的源代码,以实现此目的。