Android如何截取屏幕截图?

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

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

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

谢谢!

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

  1. 应用程序/进程决定它想要使用相机。
  2. 该应用程序/进程构建一个intent并将其传递给操作系统。
  3. 意图由OS处理,并且相机软件在新过程中执行(exec)。 如果调用同步调用intent,则调用进程可以阻塞它,也可以异步运行,调用应用程序和intent调用应用程序可以同时运行。 在相机的示例中,它可能会被同步调用并阻塞。
  4. 用户使用相机处理来拍照。
  5. Camera进程退出并生成错误或图片。
  6. 操作系统执行一些ipc(进程间通信)以将图片传递回调用进程。 根据应用程序调用的意图types,选择使用管道或消息传递留给操作系统。 相机可能会使用消息传递,因为父进程在subprocess运行时被阻止。
  7. 现在,操作系统唤醒了阻止等待返回意图的调用进程,并返回到运行状态。
  8. 图片已返回到调用应用程序,以便按需使用。

当你拍摄一个屏幕截图时,这正是发生的事情。 有一个进程正在运行以处理用户界面。 它基本上位于等待输入和filter,用于操作系统在传送到当前运行的应用程序之前应解释的任何内容。 这是另一个unix约定,在这一点上,我能想到的每个操作系统都是标准的 – 管道输入流。 它允许操作系统在传递给应用程序之前捕获更高优先级的输入,例如OS控制命令。 (想想在windows中使用ctrl-alt-delete,或在unix中使用ctrl-c / ctrl-z。)当按下屏幕截图键时,这个上游io进程会执行一个特殊的程序来拍摄一个屏幕截图(通过意图)和命令永远不会传递给’running’应用程序。 该程序在一个新进程中执行(exec),构建屏幕的位图,将其保存到库空间,并且死亡 – 所有这些都与处理时间共享的调度程序异步,因此手机在整个时间内感觉“响应”。 你可以在John Bokers中看到与所有gorp一起回答源代码来实现这一点。

浏览源代码我find了侦听组合键并启动进程的部分:

这是具体的代码:

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

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

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

如果您只是想拍摄非常简单的屏幕截图:

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的电源按钮。